diff options
author | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2025-04-24 11:01:42 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2025-04-24 17:28:18 +0900 |
commit | 5dc155351a23465ace10f32e8775fc5e23909d6e (patch) | |
tree | 9ea744c384775d3b0982978cb2012998f995cb17 | |
parent | cb1ea54bbf6cdf49c53f42720fec1a151069810c (diff) |
Do not allocate new objects at machine stack overflow
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/13167
-rw-r--r-- | signal.c | 4 | ||||
-rw-r--r-- | vm_eval.c | 2 | ||||
-rw-r--r-- | vm_insnhelper.c | 13 |
3 files changed, 10 insertions, 9 deletions
@@ -856,7 +856,7 @@ check_stack_overflow(int sig, const uintptr_t addr, const ucontext_t *ctx) ec->tag = ec->tag->prev; } reset_sigmask(sig); - rb_ec_stack_overflow(ec, crit); + rb_ec_stack_overflow(ec, crit + 1); } } # else @@ -867,7 +867,7 @@ check_stack_overflow(int sig, const void *addr) rb_thread_t *th = GET_THREAD(); if (ruby_stack_overflowed_p(th, addr)) { reset_sigmask(sig); - rb_ec_stack_overflow(th->ec, FALSE); + rb_ec_stack_overflow(th->ec, 1); } } # endif @@ -381,7 +381,7 @@ stack_check(rb_execution_context_t *ec) if (!rb_ec_raised_p(ec, RAISED_STACKOVERFLOW) && rb_ec_stack_check(ec)) { rb_ec_raised_set(ec, RAISED_STACKOVERFLOW); - rb_ec_stack_overflow(ec, FALSE); + rb_ec_stack_overflow(ec, 0); } } diff --git a/vm_insnhelper.c b/vm_insnhelper.c index 1263d27568..eddf8616fe 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -79,22 +79,23 @@ vm_stackoverflow(void) } NORETURN(void rb_ec_stack_overflow(rb_execution_context_t *ec, int crit)); +/* critical level + * 0: VM stack overflow or about to machine stack overflow + * 1: machine stack overflow but may be recoverable + * 2: fatal machine stack overflow + */ void rb_ec_stack_overflow(rb_execution_context_t *ec, int crit) { if (rb_during_gc()) { rb_bug("system stack overflow during GC. Faulty native extension?"); } - if (crit) { + if (crit > 1) { ec->raised_flag = RAISED_STACKOVERFLOW; ec->errinfo = rb_ec_vm_ptr(ec)->special_exceptions[ruby_error_stackfatal]; EC_JUMP_TAG(ec, TAG_RAISE); } -#ifdef USE_SIGALTSTACK - ec_stack_overflow(ec, TRUE); -#else - ec_stack_overflow(ec, FALSE); -#endif + ec_stack_overflow(ec, crit == 0); } static inline void stack_check(rb_execution_context_t *ec); |