summaryrefslogtreecommitdiff
path: root/src/sys-setjmp.c
diff options
context:
space:
mode:
authorGlenn Strauss <gstrauss@gluelogic.com>2022-02-06 14:50:37 -0500
committerGlenn Strauss <gstrauss@gluelogic.com>2022-02-19 02:40:34 -0500
commit6cd3b5f8affe03498911e6958ec3702fd3f8d7c6 (patch)
tree294f96320b2785a50056381d740476b5ba890d8a /src/sys-setjmp.c
parenta314b8d0316e978e29328abc7b1e5be17c65747b (diff)
downloadlighttpd-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.c6
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))) {