summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2019-06-18 17:18:49 +0300
committerDmitry Stogov <dmitry@zend.com>2019-06-18 17:18:49 +0300
commit148eb202268b0c2786e9f541b46138e5d1271761 (patch)
tree03887d168976a703de0c9e5dd0dc7cccb4d4ed6e
parent04a6aac59beaac2ef2e91b9e3c07299f7321eae7 (diff)
downloadphp-git-148eb202268b0c2786e9f541b46138e5d1271761.tar.gz
Fixed bug #78175 (Preloading segfaults at preload time and at runtime)
-rw-r--r--NEWS2
-rw-r--r--ext/opcache/ZendAccelerator.c15
-rw-r--r--ext/opcache/tests/bug78175.phpt14
-rw-r--r--ext/opcache/tests/preload_bug78175.inc4
4 files changed, 35 insertions, 0 deletions
diff --git a/NEWS b/NEWS
index 4e8b6f234f..79486faef1 100644
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,8 @@ PHP NEWS
- Opcache:
. Fixed bug #78106 (Path resolution fails if opcache disabled during request).
(Nikita)
+ . Fixed bug #78175 (Preloading segfaults at preload time and at runtime).
+ (Dmitry)
- SQLite3:
. Implement FR ##70950 (Make SQLite3 Online Backup API available). (BohwaZ)
diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c
index e75ae03234..85e0de94dd 100644
--- a/ext/opcache/ZendAccelerator.c
+++ b/ext/opcache/ZendAccelerator.c
@@ -4081,10 +4081,25 @@ static int accel_preload(const char *config)
ping_auto_globals_mask = zend_accel_get_auto_globals_no_jit();
}
+ /* Cleanup executor */
+ EG(flags) |= EG_FLAGS_IN_SHUTDOWN;
+
+ php_call_shutdown_functions();
+ zend_call_destructors();
+ php_free_shutdown_functions();
+
/* Release stored values to avoid dangling pointers */
zend_hash_graceful_reverse_destroy(&EG(symbol_table));
zend_hash_init(&EG(symbol_table), 0, NULL, ZVAL_PTR_DTOR, 0);
+#if ZEND_DEBUG
+ if (gc_enabled() && !CG(unclean_shutdown)) {
+ gc_collect_cycles();
+ }
+#endif
+
+ zend_objects_store_free_object_storage(&EG(objects_store), 1);
+
/* Inheritance errors may be thrown during linking */
zend_try {
preload_link();
diff --git a/ext/opcache/tests/bug78175.phpt b/ext/opcache/tests/bug78175.phpt
new file mode 100644
index 0000000000..eb513e3f01
--- /dev/null
+++ b/ext/opcache/tests/bug78175.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Bug #78175 (Preloading segfaults at preload time and at runtime)
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+opcache.optimization_level=-1
+opcache.preload={PWD}/preload_bug78175.inc
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+OK
+--EXPECT--
+Shutdown
+OK
diff --git a/ext/opcache/tests/preload_bug78175.inc b/ext/opcache/tests/preload_bug78175.inc
new file mode 100644
index 0000000000..bf3f33890c
--- /dev/null
+++ b/ext/opcache/tests/preload_bug78175.inc
@@ -0,0 +1,4 @@
+<?php
+register_shutdown_function(function() {
+ echo "Shutdown\n";
+});