]> granicus.if.org Git - php/commitdiff
Fixed bug #78175 (Preloading segfaults at preload time and at runtime)
authorDmitry Stogov <dmitry@zend.com>
Tue, 18 Jun 2019 14:18:49 +0000 (17:18 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 18 Jun 2019 14:18:49 +0000 (17:18 +0300)
NEWS
ext/opcache/ZendAccelerator.c
ext/opcache/tests/bug78175.phpt [new file with mode: 0644]
ext/opcache/tests/preload_bug78175.inc [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 4e8b6f234f1cf3c3232d9b44d8941cd53f586836..79486faef1a4a572740f6fb5a39f058e16956bf0 100644 (file)
--- 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)
index e75ae03234910f66ffcf4c43f5e752f2720e8df2..85e0de94ddb456ab2f4a6c86833cd0e162d29843 100644 (file)
@@ -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 (file)
index 0000000..eb513e3
--- /dev/null
@@ -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 (file)
index 0000000..bf3f338
--- /dev/null
@@ -0,0 +1,4 @@
+<?php
+register_shutdown_function(function() {
+    echo "Shutdown\n";
+});