]> granicus.if.org Git - php/commitdiff
Handle bailouts during preload linking
authorNikita Popov <nikita.ppv@gmail.com>
Fri, 15 Feb 2019 15:56:32 +0000 (16:56 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Fri, 15 Feb 2019 15:56:32 +0000 (16:56 +0100)
ext/opcache/ZendAccelerator.c
ext/opcache/tests/preload_006.phpt [new file with mode: 0644]
ext/opcache/tests/preload_inheritance_error.inc [new file with mode: 0644]
ext/opcache/tests/preload_inheritance_error_ind.inc [new file with mode: 0644]

index f30b67595937665fa5662142eb2950bbfd218791..f9e67efee86661719b611d989fa7da8135f531ec 100644 (file)
@@ -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 (file)
index 0000000..925b9a6
--- /dev/null
@@ -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 (file)
index 0000000..b0b8274
--- /dev/null
@@ -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 (file)
index 0000000..f8de052
--- /dev/null
@@ -0,0 +1,2 @@
+<?php
+opcache_compile_file(__DIR__ . '/preload_inheritance_error.inc');