From 92fae00ee0674c7fef830b01aa474d8bc684bf74 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 15 Feb 2019 16:56:32 +0100 Subject: [PATCH] Handle bailouts during preload linking --- ext/opcache/ZendAccelerator.c | 10 +++++++++- ext/opcache/tests/preload_006.phpt | 15 +++++++++++++++ ext/opcache/tests/preload_inheritance_error.inc | 9 +++++++++ .../tests/preload_inheritance_error_ind.inc | 2 ++ 4 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 ext/opcache/tests/preload_006.phpt create mode 100644 ext/opcache/tests/preload_inheritance_error.inc create mode 100644 ext/opcache/tests/preload_inheritance_error_ind.inc diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index f30b675959..f9e67efee8 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -3850,7 +3850,14 @@ static int accel_preload(const char *config) zend_hash_graceful_reverse_destroy(&EG(symbol_table)); zend_hash_init(&EG(symbol_table), 0, NULL, ZVAL_PTR_DTOR, 0); - preload_link(); + /* Inheritance errors may be thrown during linking */ + zend_try { + preload_link(); + } zend_catch { + ret = FAILURE; + goto finish; + } zend_end_try(); + preload_remove_empty_includes(); /* Don't preload constants */ @@ -3940,6 +3947,7 @@ static int accel_preload(const char *config) zend_shared_alloc_destroy_xlat_table(); } +finish: zend_hash_destroy(preload_scripts); efree(preload_scripts); preload_scripts = NULL; diff --git a/ext/opcache/tests/preload_006.phpt b/ext/opcache/tests/preload_006.phpt new file mode 100644 index 0000000000..925b9a60b8 --- /dev/null +++ b/ext/opcache/tests/preload_006.phpt @@ -0,0 +1,15 @@ +--TEST-- +Handling of errors during linking +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.optimization_level=-1 +opcache.preload={PWD}/preload_inheritance_error_ind.inc +--SKIPIF-- + +--FILE-- + +--EXPECT-- +Fatal error: Declaration of B::foo($bar) must be compatible with A::foo() in Unknown on line 0 diff --git a/ext/opcache/tests/preload_inheritance_error.inc b/ext/opcache/tests/preload_inheritance_error.inc new file mode 100644 index 0000000000..b0b8274060 --- /dev/null +++ b/ext/opcache/tests/preload_inheritance_error.inc @@ -0,0 +1,9 @@ +