diff --git a/ext/jruby/org/jruby/ext/strscan/RubyStringScanner.java b/ext/jruby/org/jruby/ext/strscan/RubyStringScanner.java index 6e6501f15f..04bae8b505 100644 --- a/ext/jruby/org/jruby/ext/strscan/RubyStringScanner.java +++ b/ext/jruby/org/jruby/ext/strscan/RubyStringScanner.java @@ -589,7 +589,7 @@ public IRubyObject scan_base10_integer(ThreadContext context) { len++; } - if (!Character.isDigit(bytes.get(ptr + len))) { + if (len >= remaining_len || !Character.isDigit(bytes.get(ptr + len))) { return context.nil; } diff --git a/test/strscan/test_stringscanner.rb b/test/strscan/test_stringscanner.rb index 109f8e1f9a..085a911313 100644 --- a/test/strscan/test_stringscanner.rb +++ b/test/strscan/test_stringscanner.rb @@ -1001,6 +1001,16 @@ def test_scan_integer assert_equal(0, s.pos) refute_predicate(s, :matched?) + s = create_string_scanner('-') + assert_nil(s.scan_integer) + assert_equal(0, s.pos) + refute_predicate(s, :matched?) + + s = create_string_scanner('+') + assert_nil(s.scan_integer) + assert_equal(0, s.pos) + refute_predicate(s, :matched?) + huge_integer = '1' * 2_000 s = create_string_scanner(huge_integer) assert_equal(huge_integer.to_i, s.scan_integer)