diff options
author | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2023-07-19 01:27:45 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2023-07-19 03:40:05 +0900 |
commit | fe4d906f5fbacbe6e9267af3bd3503339bad63a9 (patch) | |
tree | 504787b149ac6212203202572189b8aa93266486 /eval_error.c | |
parent | ac7d34026aced2d38045fae05676d9c1605aa08d (diff) | |
download | ruby-fe4d906f5fbacbe6e9267af3bd3503339bad63a9.tar.gz |
[Bug #19774] Fix segfault at `return` in `END`
Diffstat (limited to 'eval_error.c')
-rw-r--r-- | eval_error.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/eval_error.c b/eval_error.c index 04891f4369..bdce295f6e 100644 --- a/eval_error.c +++ b/eval_error.c @@ -461,7 +461,12 @@ exiting_split(VALUE errinfo, volatile int *exitcode, volatile int *sigstatus) if (NIL_P(errinfo)) return 0; - if (rb_obj_is_kind_of(errinfo, rb_eSystemExit)) { + if (THROW_DATA_P(errinfo)) { + int throw_state = ((const struct vm_throw_data *)errinfo)->throw_state; + ex = throw_state & VM_THROW_STATE_MASK; + result |= EXITING_WITH_STATUS; + } + else if (rb_obj_is_kind_of(errinfo, rb_eSystemExit)) { ex = sysexit_status(errinfo); result |= EXITING_WITH_STATUS; } |