From: Rasmus Lerdorf Date: Tue, 18 Mar 2008 21:14:28 +0000 (+0000) Subject: Make the sigsetjmp change more robust. On systems that don't have X-Git-Tag: BEFORE_NEW_PARAMETER_PARSE~539 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=10afe5d96bc3d562958e905102de1db44188ac2b;p=php Make the sigsetjmp change more robust. On systems that don't have sigsetjmp use setjmp. Windows is of course weird in that it seems to have sigsetjmp but not sigjmp_buf (??) so force it to use setjmp in config.w32.h.in --- diff --git a/Zend/Zend.m4 b/Zend/Zend.m4 index 61150fab00..bbb3411a4a 100644 --- a/Zend/Zend.m4 +++ b/Zend/Zend.m4 @@ -109,7 +109,7 @@ dnl Checks for library functions. AC_FUNC_VPRINTF AC_FUNC_MEMCMP AC_FUNC_ALLOCA -AC_CHECK_FUNCS(memcpy strdup getpid kill strtod strtol finite fpclass) +AC_CHECK_FUNCS(memcpy strdup getpid kill strtod strtol finite fpclass sigsetjmp) AC_ZEND_BROKEN_SPRINTF AC_CHECK_FUNCS(finite isfinite isinf isnan) diff --git a/Zend/zend.c b/Zend/zend.c index a7bd8a773d..71b39fcb74 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; - siglongjmp(*EG(bailout), FAILURE); + LONGJMP(*EG(bailout), FAILURE); } /* }}} */ END_EXTERN_C() diff --git a/Zend/zend.h b/Zend/zend.h index 2d7a21e1dc..5249f8c078 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -520,13 +520,23 @@ END_EXTERN_C() #define zend_bailout() _zend_bailout(__FILE__, __LINE__) +#ifdef HAVE_SIGSETJMP +# define SETJMP(a) sigsetjmp(a, 0) +# define LONGJMP(a,b) siglongjmp(a, b) +# define JMP_BUF sigjmp_buf +#else +# define SETJMP(a) setjmp(a) +# define LONGJMP(a,b) longjmp(a, b) +# define JMP_BUF jmp_buf +#endif + #define zend_try \ { \ - sigjmp_buf *__orig_bailout = EG(bailout); \ - sigjmp_buf __bailout; \ + JMP_BUF *__orig_bailout = EG(bailout); \ + JMP_BUF __bailout; \ \ EG(bailout) = &__bailout; \ - if (sigsetjmp(__bailout, 0)==0) { + if (SETJMP(__bailout)==0) { #define zend_catch \ } else { \ EG(bailout) = __orig_bailout; diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h index 3e3e34a1d6..66997b3ae0 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 */ - sigjmp_buf *bailout; + JMP_BUF *bailout; int error_reporting; int orig_error_reporting; diff --git a/win32/build/config.w32.h.in b/win32/build/config.w32.h.in index 442850a3e5..5a3311856b 100644 --- a/win32/build/config.w32.h.in +++ b/win32/build/config.w32.h.in @@ -54,6 +54,7 @@ #define NEED_ISBLANK 1 #define DISCARD_PATH 0 #undef HAVE_SETITIMER +#undef HAVE_SIGSETJMP #undef HAVE_IODBC #define HAVE_LIBDL 1 #define HAVE_GETTIMEOFDAY 1