From 148eb202268b0c2786e9f541b46138e5d1271761 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 18 Jun 2019 17:18:49 +0300 Subject: [PATCH] Fixed bug #78175 (Preloading segfaults at preload time and at runtime) --- NEWS | 2 ++ ext/opcache/ZendAccelerator.c | 15 +++++++++++++++ ext/opcache/tests/bug78175.phpt | 14 ++++++++++++++ ext/opcache/tests/preload_bug78175.inc | 4 ++++ 4 files changed, 35 insertions(+) create mode 100644 ext/opcache/tests/bug78175.phpt create mode 100644 ext/opcache/tests/preload_bug78175.inc diff --git a/NEWS b/NEWS index 4e8b6f234f1..79486faef1a 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 e75ae032349..85e0de94ddb 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 00000000000..eb513e3f017 --- /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-- + +--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 00000000000..bf3f33890c7 --- /dev/null +++ b/ext/opcache/tests/preload_bug78175.inc @@ -0,0 +1,4 @@ +