diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2019-02-15 16:56:32 +0100 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2019-02-15 16:56:32 +0100 |
commit | 92fae00ee0674c7fef830b01aa474d8bc684bf74 (patch) | |
tree | 45a1842ed9aa27ea640f047048cd5bdc8048176a | |
parent | a9497cecf3a76b3264ed0807023cd59e9bcf6f23 (diff) | |
download | php-git-92fae00ee0674c7fef830b01aa474d8bc684bf74.tar.gz |
Handle bailouts during preload linking
-rw-r--r-- | ext/opcache/ZendAccelerator.c | 10 | ||||
-rw-r--r-- | ext/opcache/tests/preload_006.phpt | 15 | ||||
-rw-r--r-- | ext/opcache/tests/preload_inheritance_error.inc | 9 | ||||
-rw-r--r-- | ext/opcache/tests/preload_inheritance_error_ind.inc | 2 |
4 files changed, 35 insertions, 1 deletions
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-- +<?php require_once('skipif.inc'); ?> +--FILE-- +<?php +echo "Foobar\n"; +?> +--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 @@ +<?php + +interface A { + public function foo(); +} + +class B implements A { + public function foo($bar) {} +} diff --git a/ext/opcache/tests/preload_inheritance_error_ind.inc b/ext/opcache/tests/preload_inheritance_error_ind.inc new file mode 100644 index 0000000000..f8de05230e --- /dev/null +++ b/ext/opcache/tests/preload_inheritance_error_ind.inc @@ -0,0 +1,2 @@ +<?php +opcache_compile_file(__DIR__ . '/preload_inheritance_error.inc'); |