diff options
author | Glenn Strauss <gstrauss@gluelogic.com> | 2022-02-06 14:50:37 -0500 |
---|---|---|
committer | Glenn Strauss <gstrauss@gluelogic.com> | 2022-02-19 02:40:34 -0500 |
commit | 6cd3b5f8affe03498911e6958ec3702fd3f8d7c6 (patch) | |
tree | 294f96320b2785a50056381d740476b5ba890d8a /src/sys-setjmp.c | |
parent | a314b8d0316e978e29328abc7b1e5be17c65747b (diff) | |
download | lighttpd-git-6cd3b5f8affe03498911e6958ec3702fd3f8d7c6.tar.gz |
[multiple] use new sys_setjmp_eval3() interface
wrap system os setjmp or compiler try/catch and access mmap inside
callback to protect against SIGBUS (or _WIN32 EXCEPTION_IN_PAGE_ERROR)
Diffstat (limited to 'src/sys-setjmp.c')
-rw-r--r-- | src/sys-setjmp.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/src/sys-setjmp.c b/src/sys-setjmp.c index c5c18bbe..1142c9cf 100644 --- a/src/sys-setjmp.c +++ b/src/sys-setjmp.c @@ -51,9 +51,15 @@ void sys_setjmp_sigbus (int sig) * something (elsewhere) is missing protection to catch SIGBUS.) */ +/* Note: sigaction() config in server.c sets SA_NODEFER and empty signal mask + * so we avoid saving and restoring signal mask on systems with sigaction() */ + #ifdef _WIN32 #define if_SYS_SETJMP_TRY() if ((sys_setjmp_sigbus_jmp_valid = \ !setjmp(sys_setjmp_sigbus_jmp_buf))) { +#elif defined(HAVE_SIGACTION) +#define if_SYS_SETJMP_TRY() if ((sys_setjmp_sigbus_jmp_valid = \ + !sigsetjmp(sys_setjmp_sigbus_jmp_buf, 0))) { #else #define if_SYS_SETJMP_TRY() if ((sys_setjmp_sigbus_jmp_valid = \ !sigsetjmp(sys_setjmp_sigbus_jmp_buf, 1))) { |