From 00160b4430a7a02656fc07a7752d1c2d83e80871 Mon Sep 17 00:00:00 2001 From: jvoisin Date: Thu, 9 Aug 2018 15:37:25 +0200 Subject: Fix a crash/hang when using fpm's pools We might have ended up in infinite loops when using php-fpm, if several different process hooked some functions twice. Thanks to @sriccio for reporting the issue --- src/sp_execute.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) (limited to 'src/sp_execute.c') diff --git a/src/sp_execute.c b/src/sp_execute.c index 1c1672a..134aab2 100644 --- a/src/sp_execute.c +++ b/src/sp_execute.c @@ -9,7 +9,7 @@ static void (*orig_execute_ex)(zend_execute_data *execute_data); static void (*orig_zend_execute_internal)(zend_execute_data *execute_data, zval *return_value); static int (*orig_zend_stream_open)(const char *filename, - zend_file_handle *handle); + zend_file_handle *handle) = NULL; // FIXME handle symlink ZEND_COLD static inline void terminate_if_writable(const char *filename) { @@ -271,17 +271,23 @@ end: int hook_execute(void) { TSRMLS_FETCH(); - /* zend_execute_ex is used for "user" function calls */ - orig_execute_ex = zend_execute_ex; - zend_execute_ex = sp_execute_ex; + if (NULL == orig_zend_stream_open) { + /* zend_execute_ex is used for "user" function calls */ + orig_execute_ex = zend_execute_ex; + zend_execute_ex = sp_execute_ex; + } - /* zend_execute_internal is used for "builtin" functions calls */ - orig_zend_execute_internal = zend_execute_internal; - zend_execute_internal = sp_zend_execute_internal; + if (NULL == orig_zend_execute_internal) { + /* zend_execute_internal is used for "builtin" functions calls */ + orig_zend_execute_internal = zend_execute_internal; + zend_execute_internal = sp_zend_execute_internal; + } - /* zend_stream_open_function is used for include-related stuff */ - orig_zend_stream_open = zend_stream_open_function; - zend_stream_open_function = sp_stream_open; + if (NULL == orig_zend_stream_open) { + /* zend_stream_open_function is used for include-related stuff */ + orig_zend_stream_open = zend_stream_open_function; + zend_stream_open_function = sp_stream_open; + } return SUCCESS; } -- cgit v1.3