1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

merge revision(s) 6d3f447aec: [Backport #18631]

Fix multiplex backreferencs near end of string in regexp match

	Idea from Jirka Marsik.

	Fixes [Bug #18631]
	---
	 regexec.c                | 6 ++++--
	 test/ruby/test_regexp.rb | 6 ++++++
	 2 files changed, 10 insertions(+), 2 deletions(-)
This commit is contained in:
nagachika 2022-09-04 16:01:43 +09:00
parent 1cfc139f6d
commit 6b8bf6ba5d
3 changed files with 11 additions and 3 deletions

View file

@ -1176,11 +1176,13 @@ static int string_cmp_ic(OnigEncoding enc, int case_fold_flag,
# define DATA_ENSURE_CHECK1 (s < right_range)
# define DATA_ENSURE_CHECK(n) (s + (n) <= right_range)
# define DATA_ENSURE(n) if (s + (n) > right_range) goto fail
# define DATA_ENSURE_CONTINUE(n) if (s + (n) > right_range) continue
# define ABSENT_END_POS right_range
#else
# define DATA_ENSURE_CHECK1 (s < end)
# define DATA_ENSURE_CHECK(n) (s + (n) <= end)
# define DATA_ENSURE(n) if (s + (n) > end) goto fail
# define DATA_ENSURE_CONTINUE(n) if (s + (n) > end) continue
# define ABSENT_END_POS end
#endif /* USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE */
@ -2643,7 +2645,7 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,
? STACK_AT(mem_end_stk[mem])->u.mem.pstr
: (UChar* )((void* )mem_end_stk[mem]));
n = pend - pstart;
DATA_ENSURE(n);
DATA_ENSURE_CONTINUE(n);
sprev = s;
swork = s;
STRING_CMP_VALUE(pstart, swork, n, is_fail);
@ -2682,7 +2684,7 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,
? STACK_AT(mem_end_stk[mem])->u.mem.pstr
: (UChar* )((void* )mem_end_stk[mem]));
n = pend - pstart;
DATA_ENSURE(n);
DATA_ENSURE_CONTINUE(n);
sprev = s;
swork = s;
STRING_CMP_VALUE_IC(case_fold_flag, pstart, &swork, n, end, is_fail);

View file

@ -1406,6 +1406,12 @@ class TestRegexp < Test::Unit::TestCase
end;
end
def test_bug18631
assert_kind_of MatchData, /(?<x>a)(?<x>aa)\k<x>/.match("aaaaa")
assert_kind_of MatchData, /(?<x>a)(?<x>aa)\k<x>/.match("aaaa")
assert_kind_of MatchData, /(?<x>a)(?<x>aa)\k<x>/.match("aaaab")
end
# This assertion is for porting x2() tests in testpy.py of Onigmo.
def assert_match_at(re, str, positions, msg = nil)
re = Regexp.new(re) unless re.is_a?(Regexp)

View file

@ -11,7 +11,7 @@
# define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
#define RUBY_VERSION_TEENY 3
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
#define RUBY_PATCHLEVEL 45
#define RUBY_PATCHLEVEL 46
#define RUBY_RELEASE_YEAR 2022
#define RUBY_RELEASE_MONTH 9