From 6d3ea95c685473d9d42890bcb32e5e9aeedc7b1a Mon Sep 17 00:00:00 2001 From: Jack Conger Date: Fri, 2 Jan 2026 10:13:45 -0800 Subject: [PATCH] Call sigsetjmp/siglongjmp directly in code This lets us control when we do want to save the signal mask (i.e., when longjmping out of the signal handler) or don't (i.e., whenever we're just doing exceptions). --- es.h | 6 +++--- except.c | 2 +- input.c | 2 +- signal.c | 2 +- stdenv.h | 14 ++++---------- 5 files changed, 10 insertions(+), 16 deletions(-) diff --git a/es.h b/es.h index cf298c09..680e8915 100644 --- a/es.h +++ b/es.h @@ -364,7 +364,7 @@ extern void getsigeffects(Sigeffect effects[]); extern List *mksiglist(void); extern void initsignals(Boolean interactive, Boolean allowdumps); extern Atomic slow; -extern jmp_buf slowlabel; +extern sigjmp_buf slowlabel; extern Boolean sigint_newline; extern void sigchk(void); extern Boolean issilentsignal(List *e); @@ -506,7 +506,7 @@ struct Handler { Root *rootlist; Push *pushlist; unsigned long evaldepth; - jmp_buf label; + sigjmp_buf label; }; extern Handler *tophandler, *roothandler; @@ -530,7 +530,7 @@ extern List *raised(List *e); _localhandler.evaldepth = evaldepth; \ _localhandler.up = tophandler; \ tophandler = &_localhandler; \ - if (!setjmp(_localhandler.label)) { + if (!sigsetjmp(_localhandler.label, 0)) { #define CatchException(e) \ pophandler(&_localhandler); \ diff --git a/except.c b/except.c index 20ac6443..81f2eb31 100644 --- a/except.c +++ b/except.c @@ -43,7 +43,7 @@ extern Noreturn throw(List *e) { rootlist = handler->rootlist; #endif exception = e; - longjmp(handler->label, 1); + siglongjmp(handler->label, 1); NOTREACHED; } diff --git a/input.c b/input.c index 4a878dfb..d64e73fc 100644 --- a/input.c +++ b/input.c @@ -150,7 +150,7 @@ static char *callreadline(char *prompt0) { } if (RL_ISSTATE(RL_STATE_INITIALIZED)) rl_reset_screen_size(); - if (!setjmp(slowlabel)) { + if (!sigsetjmp(slowlabel, 1)) { slow = TRUE; r = readline(prompt); } else { diff --git a/signal.c b/signal.c index f759e3af..dd9eddf2 100644 --- a/signal.c +++ b/signal.c @@ -85,7 +85,7 @@ static void catcher(int sig) { ++sigcount; } if (slow) - longjmp(slowlabel, 1); + siglongjmp(slowlabel, 1); } diff --git a/stdenv.h b/stdenv.h index aa2780ea..48675cd5 100644 --- a/stdenv.h +++ b/stdenv.h @@ -144,16 +144,10 @@ extern void *qsort( /* setjmp */ -#if defined sigsetjmp || HAVE_SIGSETJMP -/* under linux, sigsetjmp and setjmp are both macros - * -- need to undef setjmp to avoid problems - */ -# ifdef setjmp -# undef setjmp -# endif -# define setjmp(buf) sigsetjmp(buf,1) -# define longjmp(x,y) siglongjmp(x,y) -# define jmp_buf sigjmp_buf +#if !defined sigsetjmp && !HAVE_SIGSETJMP +#define sigsetjmp(b,n) setjmp(b) +#define siglongjmp(x,y) longjmp(x,y) +#define sigjmp_buf jmp_buf #endif