summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorValentin Bartenev <vbart@nginx.com>2018-11-22 20:23:43 +0300
committerValentin Bartenev <vbart@nginx.com>2018-11-22 20:23:43 +0300
commit262578dc71e4c1aaad01656a9b0c78539b1e7371 (patch)
tree0b2046f05e0fe1aa2e182ce3632e9414a2fa807f
parentadf22b6a0d3481f7fc4d38ade08a2a0dd4ea6f19 (diff)
downloadunit-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/php27
-rw-r--r--src/nxt_php_sapi.c8
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);