From 2d512340c769e6f231785626ad015598805c25db Mon Sep 17 00:00:00 2001 From: Charles Oliver Nutter Date: Fri, 2 May 2025 19:59:01 -0500 Subject: [PATCH 1/2] Check if len++ walked off the end In CRuby, there's always a null byte so you can walk off without a fault. In JRuby, String bytes typically are exactly the length of the string, so walking off the end triggers an error. Fixes #152 --- ext/jruby/org/jruby/ext/strscan/RubyStringScanner.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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; } From 2dc98a19085ee89281b7b14ed84b338222f544b8 Mon Sep 17 00:00:00 2001 From: Charles Oliver Nutter Date: Fri, 2 May 2025 20:04:13 -0500 Subject: [PATCH 2/2] Add tests for sign-only scan_integer calls See #152 --- test/strscan/test_stringscanner.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) 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)