mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Fix infinite loop in ensure after NoMemoryError
VM patch from wanabe. Test based on example from buzztaiki (Taiki Sugawara). Test fails when compiles with -DRUBY_DEBUG, as that can can use rb_bug instead of NoMemoryError, which doesn't allow testing this case. Test also fails on MingW, as RangeError is used instead of NoMemoryError. Skip the test in either case. Fixes [Bug #15779]
This commit is contained in:
parent
230111802c
commit
a6dc48f86a
Notes:
git
2021-07-28 02:48:27 +09:00
2 changed files with 26 additions and 1 deletions
|
@ -560,6 +560,31 @@ end.join
|
|||
end;
|
||||
end
|
||||
|
||||
def test_ensure_after_nomemoryerror
|
||||
assert_separately([], "'a' * 1_000_000_000_000_000_000")
|
||||
rescue NoMemoryError
|
||||
assert_raise(NoMemoryError) do
|
||||
assert_separately([], "#{<<~"begin;"}\n#{<<~'end;'}")
|
||||
bug15779 = bug15779 = '[ruby-core:92342]'
|
||||
begin;
|
||||
require 'open-uri'
|
||||
|
||||
begin
|
||||
'a' * 1_000_000_000_000_000_000
|
||||
ensure
|
||||
URI.open('http://www.ruby-lang.org/')
|
||||
end
|
||||
end;
|
||||
end
|
||||
rescue Minitest::Assertion
|
||||
# Possibly compiled with -DRUBY_DEBUG, in which
|
||||
# case rb_bug is used instead of NoMemoryError,
|
||||
# and we cannot test ensure after NoMemoryError.
|
||||
rescue RangeError
|
||||
# MingW can raise RangeError instead of NoMemoryError,
|
||||
# so we cannot test this case.
|
||||
end
|
||||
|
||||
def test_equal
|
||||
bug5865 = '[ruby-core:41979]'
|
||||
assert_equal(RuntimeError.new("a"), RuntimeError.new("a"), bug5865)
|
||||
|
|
2
vm.c
2
vm.c
|
@ -2168,7 +2168,7 @@ vm_exec(rb_execution_context_t *ec, bool mjit_enable_p)
|
|||
}
|
||||
else {
|
||||
result = ec->errinfo;
|
||||
rb_ec_raised_reset(ec, RAISED_STACKOVERFLOW);
|
||||
rb_ec_raised_reset(ec, RAISED_STACKOVERFLOW | RAISED_NOMEMORY);
|
||||
while ((result = vm_exec_handle_exception(ec, state, result, &initial)) == Qundef) {
|
||||
/* caught a jump, exec the handler */
|
||||
result = vm_exec_core(ec, initial);
|
||||
|
|
Loading…
Reference in a new issue