Skip to content

Commit 36b44df

Browse files
committedMar 14, 2018
fix for #5086, RegexpError invalid pattern in look-behind for certain Regexps since 9.1.16.0
1 parent 334a7f0 commit 36b44df

File tree

1 file changed

+17
-12
lines changed

1 file changed

+17
-12
lines changed
 

Diff for: ‎core/src/main/java/org/jruby/RubyRegexp.java

+17-12
Original file line numberDiff line numberDiff line change
@@ -408,29 +408,34 @@ private static void encodingMatchError(Ruby runtime, Regex pattern, Encoding str
408408
pattern.getEncoding() + " regexp with " + strEnc + " string)");
409409
}
410410

411-
private Encoding checkEncoding(RubyString str, boolean warn) {
412-
if (str.scanForCodeRange() == StringSupport.CR_BROKEN) {
413-
throw getRuntime().newArgumentError("invalid byte sequence in " + str.getEncoding());
411+
private Encoding prepareEncoding(RubyString str, boolean warn) {
412+
Encoding enc = str.getEncoding();
413+
int cr = str.scanForCodeRange();
414+
if (cr == StringSupport.CR_BROKEN) {
415+
throw getRuntime().newArgumentError("invalid byte sequence in " + enc);
414416
}
415417
check();
416-
Encoding enc = str.getEncoding();
417-
if (!enc.isAsciiCompatible()) {
418-
if (enc != pattern.getEncoding()) encodingMatchError(getRuntime(), pattern, enc);
418+
Encoding patternEnc = pattern.getEncoding();
419+
if (patternEnc == enc) {
420+
} else if (cr == StringSupport.CR_7BIT && patternEnc == USASCIIEncoding.INSTANCE) {
421+
enc = patternEnc;
422+
} else if (!enc.isAsciiCompatible()) {
423+
encodingMatchError(getRuntime(), pattern, enc);
419424
} else if (options.isFixed()) {
420-
if (enc != pattern.getEncoding() &&
421-
(!pattern.getEncoding().isAsciiCompatible() ||
422-
str.scanForCodeRange() != StringSupport.CR_7BIT)) encodingMatchError(getRuntime(), pattern, enc);
423-
enc = pattern.getEncoding();
425+
if (enc != patternEnc &&
426+
(!patternEnc.isAsciiCompatible() ||
427+
cr != StringSupport.CR_7BIT)) encodingMatchError(getRuntime(), pattern, enc);
428+
enc = patternEnc;
424429
}
425-
if (warn && isEncodingNone() && enc != ASCIIEncoding.INSTANCE && str.scanForCodeRange() != StringSupport.CR_7BIT) {
430+
if (warn && isEncodingNone() && enc != ASCIIEncoding.INSTANCE && cr != StringSupport.CR_7BIT) {
426431
getRuntime().getWarnings().warn(ID.REGEXP_MATCH_AGAINST_STRING, "regexp match /.../n against to " + enc + " string");
427432
}
428433
return enc;
429434
}
430435

431436
public final Regex preparePattern(RubyString str) {
432437
// checkEncoding does `check();` no need to here
433-
Encoding enc = checkEncoding(str, true);
438+
Encoding enc = prepareEncoding(str, true);
434439
if (enc == pattern.getEncoding()) return pattern;
435440
return getPreprocessedRegexpFromCache(getRuntime(), this.str, enc, options, RegexpSupport.ErrorMode.PREPROCESS);
436441
}

0 commit comments

Comments
 (0)
Please sign in to comment.