diff --git a/ext/jruby/org/jruby/ext/strscan/RubyStringScanner.java b/ext/jruby/org/jruby/ext/strscan/RubyStringScanner.java index a1e81effcd..7d3e7494fc 100644 --- a/ext/jruby/org/jruby/ext/strscan/RubyStringScanner.java +++ b/ext/jruby/org/jruby/ext/strscan/RubyStringScanner.java @@ -265,7 +265,8 @@ private IRubyObject scan(ThreadContext context, IRubyObject regex, boolean succp check(context); clearMatched(); - if (restLen() < 0) { + int restLen = restLen(); + if (restLen < 0) { return context.nil; } @@ -275,7 +276,7 @@ private IRubyObject scan(ThreadContext context, IRubyObject regex, boolean succp if (regex instanceof RubyRegexp) { pattern = ((RubyRegexp) regex).preparePattern(str); - int range = currPtr + restLen(); + int range = currPtr + restLen; Matcher matcher = pattern.matcher(strBL.getUnsafeBytes(), matchTarget(), range); final int ret; @@ -298,17 +299,14 @@ private IRubyObject scan(ThreadContext context, IRubyObject regex, boolean succp if (ret < 0) return context.nil; } else { RubyString pattern = regex.convertToString(); - Encoding patternEnc = str.checkEncoding(pattern); - - if (restLen() < pattern.size()) { - return context.nil; - } - ByteList patternBL = pattern.getByteList(); int patternSize = patternBL.realSize(); if (headonly) { + if (restLen < pattern.size()) { + return context.nil; + } if (ByteList.memcmp(strBL.unsafeBytes(), currPtr, patternBL.unsafeBytes(), patternBL.begin(), patternSize) != 0) { return context.nil; } diff --git a/test/strscan/test_stringscanner.rb b/test/strscan/test_stringscanner.rb index 9b7b7910d0..54fd5027cf 100644 --- a/test/strscan/test_stringscanner.rb +++ b/test/strscan/test_stringscanner.rb @@ -325,6 +325,9 @@ def test_scan_string s = create_string_scanner(str, false) matched = s.scan('str') assert_equal 'str', matched + + s = create_string_scanner("str") + assert_equal nil, s.scan("str\0\0") end def test_skip @@ -710,6 +713,9 @@ def test_scan_until_string assert_equal(nil, s.skip_until("Qux")) assert_equal("\u0000Baz", s.scan_until("Baz")) assert_equal(11, s.pos) + + s = create_string_scanner("str") + assert_equal nil, s.scan_until("str\0\0") end def test_skip_until