Skip to content

Commit 7b55ff2

Browse files
committed
merge revision(s) 564ccd0: [Backport #17756]
[ruby/strscan] Fix segmentation fault of `StringScanner#charpos` when `String#byteslice` returns non string value [Bug #17756] (#20) ruby/strscan@92961cde2b --- ext/strscan/strscan.c | 5 +---- test/strscan/test_stringscanner.rb | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 4 deletions(-)
1 parent e6e25b7 commit 7b55ff2

File tree

3 files changed

+19
-5
lines changed

3 files changed

+19
-5
lines changed

ext/strscan/strscan.c

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -445,13 +445,10 @@ static VALUE
445445
strscan_get_charpos(VALUE self)
446446
{
447447
struct strscanner *p;
448-
VALUE substr;
449448

450449
GET_SCANNER(self, p);
451450

452-
substr = rb_funcall(p->str, id_byteslice, 2, INT2FIX(0), LONG2NUM(p->curr));
453-
454-
return rb_str_length(substr);
451+
return LONG2NUM(rb_enc_strlen(S_PBEG(p), CURPTR(p), rb_enc_get(p->str)));
455452
}
456453

457454
/*

test/strscan/test_stringscanner.rb

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,23 @@ def test_pos_unicode
206206
assert_equal 11, s.charpos
207207
end
208208

209+
def test_charpos_not_use_string_methods
210+
string = +'abcädeföghi'
211+
scanner = create_string_scanner(string)
212+
213+
class << string
214+
EnvUtil.suppress_warning do
215+
undef_method(*instance_methods)
216+
end
217+
end
218+
219+
assert_equal 0, scanner.charpos
220+
assert_equal "abcä", scanner.scan_until(/ä/)
221+
assert_equal 4, scanner.charpos
222+
assert_equal "defö", scanner.scan_until(/ö/)
223+
assert_equal 8, scanner.charpos
224+
end
225+
209226
def test_concat
210227
s = create_string_scanner('a'.dup)
211228
s.scan(/a/)

version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
# define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
1313
#define RUBY_VERSION_TEENY 3
1414
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
15-
#define RUBY_PATCHLEVEL 134
15+
#define RUBY_PATCHLEVEL 135
1616

1717
#define RUBY_RELEASE_YEAR 2021
1818
#define RUBY_RELEASE_MONTH 9

0 commit comments

Comments
 (0)