From 574f3af36ea008896419d2e2407f8fce83bdcd2e Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Wed, 18 Aug 2021 14:09:29 +0900 Subject: Rewind execution tags more at stack overflow [Bug #18084] --- signal.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'signal.c') diff --git a/signal.c b/signal.c index 46ac6c26cc..dd05e8270e 100644 --- a/signal.c +++ b/signal.c @@ -878,12 +878,13 @@ check_stack_overflow(int sig, const uintptr_t addr, const ucontext_t *ctx) (sp_page <= fault_page && fault_page <= bp_page)) { rb_execution_context_t *ec = GET_EC(); int crit = FALSE; - if ((uintptr_t)ec->tag->buf / pagesize <= fault_page + 1) { + int uplevel = roomof(pagesize, sizeof(*ec->tag)) / 2; /* XXX: heuristic */ + while ((uintptr_t)ec->tag->buf / pagesize <= fault_page + 1) { /* drop the last tag if it is close to the fault, * otherwise it can cause stack overflow again at the same * place. */ + if ((crit = (!ec->tag->prev || !--uplevel)) != FALSE) break; ec->tag = ec->tag->prev; - crit = TRUE; } reset_sigmask(sig); rb_ec_stack_overflow(ec, crit); -- cgit v1.2.1