summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/strscan/strscan.c2
-rw-r--r--test/strscan/test_stringscanner.rb23
2 files changed, 15 insertions, 10 deletions
diff --git a/ext/strscan/strscan.c b/ext/strscan/strscan.c
index 012d3a4c42..e5a0ad66a3 100644
--- a/ext/strscan/strscan.c
+++ b/ext/strscan/strscan.c
@@ -1379,7 +1379,7 @@ strscan_scan_base16_integer(VALUE self)
len++;
}
- if ((remaining_len >= (len + 2)) && ptr[len] == '0' && ptr[len + 1] == 'x') {
+ if ((remaining_len >= (len + 3)) && ptr[len] == '0' && ptr[len + 1] == 'x' && rb_isxdigit(ptr[len + 2])) {
len += 2;
}
diff --git a/test/strscan/test_stringscanner.rb b/test/strscan/test_stringscanner.rb
index eb35dfa119..2f68331da5 100644
--- a/test/strscan/test_stringscanner.rb
+++ b/test/strscan/test_stringscanner.rb
@@ -1052,19 +1052,24 @@ module StringScannerTests
assert_predicate(s, :matched?)
s = create_string_scanner('0x')
- assert_nil(s.scan_integer(base: 16))
- assert_equal(0, s.pos)
- refute_predicate(s, :matched?)
+ assert_equal(0, s.scan_integer(base: 16))
+ assert_equal(1, s.pos)
+ assert_predicate(s, :matched?)
+
+ s = create_string_scanner('0xyz')
+ assert_equal(0, s.scan_integer(base: 16))
+ assert_equal(1, s.pos)
+ assert_predicate(s, :matched?)
s = create_string_scanner('-0x')
- assert_nil(s.scan_integer(base: 16))
- assert_equal(0, s.pos)
- refute_predicate(s, :matched?)
+ assert_equal(0, s.scan_integer(base: 16))
+ assert_equal(2, s.pos)
+ assert_predicate(s, :matched?)
s = create_string_scanner('+0x')
- assert_nil(s.scan_integer(base: 16))
- assert_equal(0, s.pos)
- refute_predicate(s, :matched?)
+ assert_equal(0, s.scan_integer(base: 16))
+ assert_equal(2, s.pos)
+ assert_predicate(s, :matched?)
s = create_string_scanner('-123abc')
assert_equal(-0x123abc, s.scan_integer(base: 16))