From b98c84eb88e503e250274b62eaff000c071c62a4 Mon Sep 17 00:00:00 2001 From: Andrey Loskutov Date: Wed, 15 Jul 2015 00:01:14 +0200 Subject: [PATCH] Don't crash while parsing ignore patterns Catch unexpected PatternSyntaxException and convert it to InvalidPatternException. Log such errors, do not silently ignore them. Bug: 463581 Change-Id: Id0936d9816769ec0cfae1898beda0f7a3c146e67 Signed-off-by: Andrey Loskutov Signed-off-by: Matthias Sohn --- .../org/eclipse/jgit/internal/JGitText.properties | 1 + .../org/eclipse/jgit/ignore/FastIgnoreRule.java | 5 +++++ .../org/eclipse/jgit/ignore/internal/Strings.java | 14 +++++++++++++- .../src/org/eclipse/jgit/internal/JGitText.java | 1 + 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties b/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties index 0e0b4028b..2398f54b0 100644 --- a/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties +++ b/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties @@ -328,6 +328,7 @@ invalidId=Invalid id: {0} invalidId0=Invalid id invalidIdLength=Invalid id length {0}; should be {1} invalidIgnoreParamSubmodule=Found invalid ignore param for submodule {0}. +invalidIgnoreRule=Exception caught while parsing ignore rule ''{0}''. invalidIntegerValue=Invalid integer value: {0}.{1}={2} invalidKey=Invalid key: {0} invalidLineInConfigFile=Invalid line in config file diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/FastIgnoreRule.java b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/FastIgnoreRule.java index 16a36baf0..892d5ef8f 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/FastIgnoreRule.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/FastIgnoreRule.java @@ -47,6 +47,8 @@ import org.eclipse.jgit.errors.InvalidPatternException; import org.eclipse.jgit.ignore.internal.IMatcher; import org.eclipse.jgit.ignore.internal.PathMatcher; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * "Fast" (compared with IgnoreRule) git ignore rule implementation supporting @@ -57,6 +59,8 @@ * @since 3.6 */ public class FastIgnoreRule { + private final static Logger LOG = LoggerFactory + .getLogger(FastIgnoreRule.class); /** * Character used as default path separator for ignore entries @@ -121,6 +125,7 @@ public FastIgnoreRule(String pattern) { Character.valueOf(PATH_SEPARATOR), dirOnly); } catch (InvalidPatternException e) { m = NO_MATCH; + LOG.error(e.getMessage(), e); } this.matcher = m; } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/Strings.java b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/Strings.java index f5333eeaf..921339a3f 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/Strings.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/ignore/internal/Strings.java @@ -44,13 +44,16 @@ import static java.lang.Character.isLetter; +import java.text.MessageFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.regex.Pattern; +import java.util.regex.PatternSyntaxException; import org.eclipse.jgit.errors.InvalidPatternException; import org.eclipse.jgit.ignore.FastIgnoreRule; +import org.eclipse.jgit.internal.JGitText; /** * Various {@link String} related utility methods, written mostly to avoid @@ -367,7 +370,16 @@ && isLetter(lookAhead(pattern, i))) if (in_brackets > 0) throw new InvalidPatternException("Not closed bracket?", pattern); //$NON-NLS-1$ - return Pattern.compile(sb.toString()); + try { + return Pattern.compile(sb.toString()); + } catch (PatternSyntaxException e) { + InvalidPatternException patternException = new InvalidPatternException( + MessageFormat.format(JGitText.get().invalidIgnoreRule, + pattern), + pattern); + patternException.initCause(e); + throw patternException; + } } /** diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java index fdcfb8ecd..7622603de 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java @@ -387,6 +387,7 @@ public static JGitText get() { /***/ public String invalidId0; /***/ public String invalidIdLength; /***/ public String invalidIgnoreParamSubmodule; + /***/ public String invalidIgnoreRule; /***/ public String invalidIntegerValue; /***/ public String invalidKey; /***/ public String invalidLineInConfigFile;