diff options
author | Valentin Bartenev <vbart@nginx.com> | 2018-11-22 20:23:43 +0300 |
---|---|---|
committer | Valentin Bartenev <vbart@nginx.com> | 2018-11-22 20:23:43 +0300 |
commit | 262578dc71e4c1aaad01656a9b0c78539b1e7371 (patch) | |
tree | 0b2046f05e0fe1aa2e182ce3632e9414a2fa807f | |
parent | adf22b6a0d3481f7fc4d38ade08a2a0dd4ea6f19 (diff) | |
download | unit-262578dc71e4c1aaad01656a9b0c78539b1e7371.tar.gz unit-262578dc71e4c1aaad01656a9b0c78539b1e7371.tar.bz2 |
PHP: workaround for bug #71041.
Since PHP 7, a zend_signal_startup() call is required if the interpreter
was built with ZEND_SIGNALS defined; such a call was added in 3fd76e4ce70a.
However, the zend_signal_startup() export is missing from the PHP library;
as the result, dlopen() fails with the 'Undefined symbol "zend_signal_startup"'
error while loading the PHP module.
Meanwhile, if PHP is built without ZTS, the zend_signal_startup() call can
be omitted; otherwise, the missing call causes segmentation fault.
The PHP fix already was committed to upstream, but we still have to deal
with numerous unpatched versions remaining at large.
See the related PHP bug: https://bugs.php.net/bug.php?id=71041
-rw-r--r-- | auto/modules/php | 27 | ||||
-rw-r--r-- | src/nxt_php_sapi.c | 8 |
2 files changed, 32 insertions, 3 deletions
diff --git a/auto/modules/php b/auto/modules/php index 5d54c119..362bbc69 100644 --- a/auto/modules/php +++ b/auto/modules/php @@ -124,6 +124,30 @@ if /bin/sh -c "${NXT_PHP_CONFIG} --version" >> $NXT_AUTOCONF_ERR 2>&1; then exit 1; fi + # Bug #71041 (https://bugs.php.net/bug.php?id=71041). + + nxt_feature="PHP zend_signal_startup()" + nxt_feature_name="" + nxt_feature_run=no + nxt_feature_incs="${NXT_PHP_INCLUDE}" + nxt_feature_libs="${NXT_PHP_LIB} ${NXT_PHP_LDFLAGS}" + nxt_feature_test=" + #include <php.h> + #include <php_main.h> + + int main() { + zend_signal_startup(); + return 0; + }" + + . auto/feature + + if [ $nxt_found = yes ]; then + NXT_ZEND_SIGNAL_STARTUP=1 + else + NXT_ZEND_SIGNAL_STARTUP=0 + fi + else $echo $echo $0: error: no PHP found. @@ -181,6 +205,7 @@ for nxt_src in $NXT_PHP_MODULE_SRCS; do $NXT_BUILD_DIR/$nxt_obj: $nxt_src \$(CC) -c \$(CFLAGS) \$(NXT_INCS) $NXT_PHP_INCLUDE \\ + -DNXT_ZEND_SIGNAL_STARTUP=$NXT_ZEND_SIGNAL_STARTUP \\ $nxt_dep_flags \\ -o $NXT_BUILD_DIR/$nxt_obj $nxt_src $nxt_dep_post @@ -191,7 +216,7 @@ END done - + cat << END >> $NXT_MAKEFILE .PHONY: ${NXT_PHP_MODULE} diff --git a/src/nxt_php_sapi.c b/src/nxt_php_sapi.c index fbddd779..47b5ff04 100644 --- a/src/nxt_php_sapi.c +++ b/src/nxt_php_sapi.c @@ -270,10 +270,14 @@ nxt_php_init(nxt_task_t *task, nxt_common_app_conf_t *conf) tsrm_ls = ts_resource(0); #endif -#ifdef NXT_PHP7 -#if defined(ZEND_SIGNALS) || PHP_MINOR_VERSION > 0 +#if defined(NXT_PHP7) && defined(ZEND_SIGNALS) + +#if (NXT_ZEND_SIGNAL_STARTUP) zend_signal_startup(); +#elif defined(ZTS) +#error PHP is built with thread safety and broken signals. #endif + #endif sapi_startup(&nxt_php_sapi_module); |