From c9e0781d2abab740f81a620c27a30391a11466ab Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Tue, 18 Mar 2008 18:34:11 +0000 Subject: [PATCH] Use sigsetjmp and siglongjmp instead of setjmp/longjmp in order to be consistent in how we deal with the signal mask. POSIX doesn't specify what to do with the signal mask in setjmp/longjmp which has resulted in the signal mask getting saved on *BSD and not getting saved on Linux. Making the behaviour explicit via sigsetjmp/siglongjmp gives us consistency and saves expensive sigprocmask() syscalls on *BSD. --- Zend/zend.c | 2 +- Zend/zend.h | 6 +++--- Zend/zend_globals.h | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Zend/zend.c b/Zend/zend.c index 1f1fa582c1..a7bd8a773d 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -794,7 +794,7 @@ ZEND_API void _zend_bailout(char *filename, uint lineno) /* {{{ */ CG(unclean_shutdown) = 1; CG(in_compilation) = EG(in_execution) = 0; EG(current_execute_data) = NULL; - longjmp(*EG(bailout), FAILURE); + siglongjmp(*EG(bailout), FAILURE); } /* }}} */ END_EXTERN_C() diff --git a/Zend/zend.h b/Zend/zend.h index e85f40394c..2d7a21e1dc 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -522,11 +522,11 @@ END_EXTERN_C() #define zend_try \ { \ - jmp_buf *__orig_bailout = EG(bailout); \ - jmp_buf __bailout; \ + sigjmp_buf *__orig_bailout = EG(bailout); \ + sigjmp_buf __bailout; \ \ EG(bailout) = &__bailout; \ - if (setjmp(__bailout)==0) { + if (sigsetjmp(__bailout, 0)==0) { #define zend_catch \ } else { \ EG(bailout) = __orig_bailout; diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h index 0b6214ab1e..3e3e34a1d6 100644 --- a/Zend/zend_globals.h +++ b/Zend/zend_globals.h @@ -161,7 +161,7 @@ struct _zend_executor_globals { HashTable included_files; /* files already included */ - jmp_buf *bailout; + sigjmp_buf *bailout; int error_reporting; int orig_error_reporting; -- 2.40.0