Skip to content

Commit

Permalink
[Bug #19467] correct cache points and counting failure on `OP_ANYCHAR…
Browse files Browse the repository at this point in the history
…_STAR_PEEK_NEXT` (#7454)
  • Loading branch information
makenowjust committed Mar 13, 2023
1 parent ed269c8 commit e22c4e8
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 4 deletions.
20 changes: 16 additions & 4 deletions regexec.c
Expand Up @@ -2835,10 +2835,16 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,

CASE(OP_ANYCHAR_STAR_PEEK_NEXT) MOP_IN(OP_ANYCHAR_STAR_PEEK_NEXT);
while (DATA_ENSURE_CHECK1) {
DO_CACHE_MATCH_OPT(reg, stk_base, repeat_stk, msa->enable_cache_match_opt, pbegin, msa->num_cache_table, msa->num_cache_opcode, msa->cache_index_table, end - s, msa->match_cache);
if (*p == *s) {
DO_CACHE_MATCH_OPT(reg, stk_base, repeat_stk, msa->enable_cache_match_opt, pbegin, msa->num_cache_table, msa->num_cache_opcode, msa->cache_index_table, end - s, msa->match_cache);
STACK_PUSH_ALT(p + 1, s, sprev, pkeep);
}
} else {
/* We need to increment num_fail here, for invoking a cache optimization correctly. */
/* Actually, the matching will be failed if we use `OP_ANYCHAR_STAR` simply in this case.*/
#ifdef USE_CACHE_MATCH_OPT
msa->num_fail++;
#endif
}
n = enclen(encode, s, end);
DATA_ENSURE(n);
if (ONIGENC_IS_MBC_NEWLINE_EX(encode, s, str, end, option, 0)) goto fail;
Expand All @@ -2851,10 +2857,16 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,

CASE(OP_ANYCHAR_ML_STAR_PEEK_NEXT)MOP_IN(OP_ANYCHAR_ML_STAR_PEEK_NEXT);
while (DATA_ENSURE_CHECK1) {
DO_CACHE_MATCH_OPT(reg, stk_base, repeat_stk, msa->enable_cache_match_opt, pbegin, msa->num_cache_table, msa->num_cache_opcode, msa->cache_index_table, s - str, msa->match_cache);
if (*p == *s) {
DO_CACHE_MATCH_OPT(reg, stk_base, repeat_stk, msa->enable_cache_match_opt, pbegin, msa->num_cache_table, msa->num_cache_opcode, msa->cache_index_table, s - str, msa->match_cache);
STACK_PUSH_ALT(p + 1, s, sprev, pkeep);
}
} else {
/* We need to increment num_fail here, for invoking a cache optimization correctly. */
/* Actually, the matching will be failed if we use `OP_ANYCHAR_STAR_ML` simply in this case.*/
#ifdef USE_CACHE_MATCH_OPT
msa->num_fail++;
#endif
}
n = enclen(encode, s, end);
if (n > 1) {
DATA_ENSURE(n);
Expand Down
10 changes: 10 additions & 0 deletions test/ruby/test_regexp.rb
Expand Up @@ -1755,6 +1755,16 @@ def test_bug_19273 # [Bug #19273]
assert_equal("10:0:0".match(pattern)[0], "10:0:0")
end

def test_bug_19467
assert_separately([], "#{<<-"begin;"}\n#{<<-'end;'}")
timeout = #{ EnvUtil.apply_timeout_scale(10).inspect }
begin;
Regexp.timeout = timeout
assert_nil(/\A.*a.*z\z/ =~ "a" * 1000000 + "y")
end;
end

def test_linear_time_p
assert_send [Regexp, :linear_time?, /a/]
assert_send [Regexp, :linear_time?, 'a']
Expand Down

0 comments on commit e22c4e8

Please sign in to comment.