summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-02-15 16:56:32 +0100
committerNikita Popov <nikita.ppv@gmail.com>2019-02-15 16:56:32 +0100
commit92fae00ee0674c7fef830b01aa474d8bc684bf74 (patch)
tree45a1842ed9aa27ea640f047048cd5bdc8048176a
parenta9497cecf3a76b3264ed0807023cd59e9bcf6f23 (diff)
downloadphp-git-92fae00ee0674c7fef830b01aa474d8bc684bf74.tar.gz
Handle bailouts during preload linking
-rw-r--r--ext/opcache/ZendAccelerator.c10
-rw-r--r--ext/opcache/tests/preload_006.phpt15
-rw-r--r--ext/opcache/tests/preload_inheritance_error.inc9
-rw-r--r--ext/opcache/tests/preload_inheritance_error_ind.inc2
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');