diff --git a/src/org/joni/Config.java b/src/org/joni/Config.java index ac9a71b..dbaa493 100644 --- a/src/org/joni/Config.java +++ b/src/org/joni/Config.java @@ -22,6 +22,7 @@ import java.io.PrintStream; public interface Config extends org.jcodings.Config { + final int REGEX_MAX_LENGTH = ConfigSupport.getInt("joni.regex_max_length", 10000); final int CHAR_TABLE_SIZE = ConfigSupport.getInt("joni.char_table_size", 256); final boolean USE_NO_INVALID_QUANTIFIER = ConfigSupport.getBoolean("joni.use_no_invalid_quantifier", true); final int SCANENV_MEMNODES_SIZE = ConfigSupport.getInt("joni.scanenv_memnodes_size", 8); diff --git a/src/org/joni/Regex.java b/src/org/joni/Regex.java index e7e6b69..5e98312 100644 --- a/src/org/joni/Regex.java +++ b/src/org/joni/Regex.java @@ -38,6 +38,7 @@ import org.joni.exception.ErrorMessages; import org.joni.exception.InternalException; import org.joni.exception.ValueException; +import org.joni.Config; public final class Regex { int[] code; /* compiled pattern */ @@ -150,6 +151,9 @@ public Regex(byte[]bytes, int p, int end, int option, Encoding enc, Syntax synta // onig_alloc_init public Regex(byte[]bytes, int p, int end, int option, int caseFoldFlag, Encoding enc, Syntax syntax, WarnCallback warnings) { + if ((end - p) > Config.REGEX_MAX_LENGTH) { + throw new ValueException(ErrorMessages.REGEX_TOO_LONG); + } if ((option & (Option.DONT_CAPTURE_GROUP | Option.CAPTURE_GROUP)) == (Option.DONT_CAPTURE_GROUP | Option.CAPTURE_GROUP)) { diff --git a/src/org/joni/exception/ErrorMessages.java b/src/org/joni/exception/ErrorMessages.java index cb1f21f..432c158 100644 --- a/src/org/joni/exception/ErrorMessages.java +++ b/src/org/joni/exception/ErrorMessages.java @@ -32,6 +32,7 @@ public interface ErrorMessages extends org.jcodings.exception.ErrorMessages { final String INVALID_ARGUMENT = "invalid argument"; /* syntax error */ + final String REGEX_TOO_LONG = "regex length too long"; final String END_PATTERN_AT_LEFT_BRACE = "end pattern at left brace"; final String END_PATTERN_AT_LEFT_BRACKET = "end pattern at left bracket"; final String EMPTY_CHAR_CLASS = "empty char-class";