summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2025-04-24 11:01:42 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2025-04-24 17:28:18 +0900
commit5dc155351a23465ace10f32e8775fc5e23909d6e (patch)
tree9ea744c384775d3b0982978cb2012998f995cb17
parentcb1ea54bbf6cdf49c53f42720fec1a151069810c (diff)
Do not allocate new objects at machine stack overflow
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/13167
-rw-r--r--signal.c4
-rw-r--r--vm_eval.c2
-rw-r--r--vm_insnhelper.c13
3 files changed, 10 insertions, 9 deletions
diff --git a/signal.c b/signal.c
index 6c2a757a98..6f2fb1ddd3 100644
--- a/signal.c
+++ b/signal.c
@@ -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
diff --git a/vm_eval.c b/vm_eval.c
index eb075b8c02..b8694284d4 100644
--- a/vm_eval.c
+++ b/vm_eval.c
@@ -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);