diff --git a/regexec.c b/regexec.c index 81028138e06fb6..a45be566d2f055 100644 --- a/regexec.c +++ b/regexec.c @@ -446,8 +446,10 @@ count_num_cache_opcodes(const regex_t* reg, long* num_cache_opcodes_ptr) case OP_POP_POS: case OP_PUSH_POS_NOT: case OP_FAIL_POS: + goto impossible; case OP_PUSH_STOP_BT: case OP_POP_STOP_BT: + break; case OP_LOOK_BEHIND: case OP_PUSH_LOOK_BEHIND_NOT: case OP_FAIL_LOOK_BEHIND_NOT: @@ -709,8 +711,10 @@ init_cache_opcodes(const regex_t* reg, OnigCacheOpcode* cache_opcodes, long* num case OP_POP_POS: case OP_PUSH_POS_NOT: case OP_FAIL_POS: + goto unexpected_bytecode_error; case OP_PUSH_STOP_BT: case OP_POP_STOP_BT: + break; case OP_LOOK_BEHIND: case OP_PUSH_LOOK_BEHIND_NOT: case OP_FAIL_LOOK_BEHIND_NOT: diff --git a/test/ruby/test_regexp.rb b/test/ruby/test_regexp.rb index d04b9cf7664ad4..0a72caba45f9df 100644 --- a/test/ruby/test_regexp.rb +++ b/test/ruby/test_regexp.rb @@ -1760,6 +1760,16 @@ def test_match_cache_square end; end + def test_match_cache_atomic + assert_separately([], "#{<<-"begin;"}\n#{<<-'end;'}") + timeout = #{ EnvUtil.apply_timeout_scale(10).inspect } + begin; + Regexp.timeout = timeout + + assert_nil(/^(?>a?a?)(a|a)*$/ =~ "a" * 1000000 + "x") + end; + end + def test_cache_opcodes_initialize str = 'test1-test2-test3-test4-test_5' re = '^([0-9a-zA-Z\-/]*){1,256}$'