Skip to content

Commit

Permalink
Prevent StackOverflowException caused by excessive 'or' via PatternMa…
Browse files Browse the repository at this point in the history
…tcher

Signed-off-by: Robert Stupp <snazy@snazy.de>
  • Loading branch information
snazy committed Aug 22, 2019
1 parent 803a137 commit 1351cac
Showing 1 changed file with 55 additions and 12 deletions.
Expand Up @@ -16,6 +16,9 @@

package org.gradle.api.internal.file.pattern;

import java.util.ArrayList;
import java.util.List;

public abstract class PatternMatcher {
public static final PatternMatcher MATCH_ALL = new PatternMatcher() {
@Override
Expand All @@ -37,21 +40,11 @@ public PatternMatcher or(PatternMatcher other) {
public abstract boolean test(String[] segments, boolean isFile);

public PatternMatcher and(final PatternMatcher other) {
return new PatternMatcher() {
@Override
public boolean test(String[] segments, boolean isFile) {
return PatternMatcher.this.test(segments, isFile) && other.test(segments, isFile);
}
};
return new And(PatternMatcher.this, other);
}

public PatternMatcher or(final PatternMatcher other) {
return new PatternMatcher() {
@Override
public boolean test(String[] segments, boolean isFile) {
return PatternMatcher.this.test(segments, isFile) || other.test(segments, isFile);
}
};
return new Or(PatternMatcher.this, other);
}

public PatternMatcher negate() {
Expand All @@ -62,4 +55,54 @@ public boolean test(String[] segments, boolean isFile) {
}
};
}

private static final class Or extends PatternMatcher {
private final List<PatternMatcher> parts = new ArrayList<PatternMatcher>();

public Or(PatternMatcher patternMatcher, PatternMatcher other) {
parts.add(patternMatcher);
parts.add(other);
}

@Override
public PatternMatcher or(PatternMatcher other) {
parts.add(other);
return this;
}

@Override
public boolean test(String[] segments, boolean isFile) {
for (PatternMatcher part : parts) {
if (part.test(segments, isFile)) {
return true;
}
}
return false;
}
}

private static final class And extends PatternMatcher {
private final List<PatternMatcher> parts = new ArrayList<PatternMatcher>();

public And(PatternMatcher patternMatcher, PatternMatcher other) {
parts.add(patternMatcher);
parts.add(other);
}

@Override
public PatternMatcher and(PatternMatcher other) {
parts.add(other);
return this;
}

@Override
public boolean test(String[] segments, boolean isFile) {
for (PatternMatcher part : parts) {
if (!part.test(segments, isFile)) {
return false;
}
}
return true;
}
}
}

0 comments on commit 1351cac

Please sign in to comment.