summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-07-04 11:05:01 +0200
committerNikita Popov <nikita.ppv@gmail.com>2019-07-04 11:05:01 +0200
commitdf243f19be8509f36c9a79a2f601bbaeb37762ae (patch)
tree058a32d2c9477c95a9ff2334d9dc17b2f9711618
parent1fea887cc00ea01fd34bc17860c1d41370f23e53 (diff)
downloadphp-git-df243f19be8509f36c9a79a2f601bbaeb37762ae.tar.gz
Preloading: Prevent autoloading while resolving constants
-rw-r--r--ext/opcache/ZendAccelerator.c2
-rw-r--r--ext/opcache/tests/preload_012.phpt14
-rw-r--r--ext/opcache/tests/preload_const_autoload.inc7
-rw-r--r--ext/opcache/tests/preload_const_autoload_2.inc5
4 files changed, 28 insertions, 0 deletions
diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c
index e41ef6725d..c94c668c9a 100644
--- a/ext/opcache/ZendAccelerator.c
+++ b/ext/opcache/ZendAccelerator.c
@@ -3414,6 +3414,7 @@ static zend_bool preload_try_resolve_constants(zend_class_entry *ce)
zval *val;
EG(exception) = (void*)(uintptr_t)-1; /* prevent error reporting */
+ CG(in_compilation) = 1; /* prevent autoloading */
do {
ok = 1;
changed = 0;
@@ -3455,6 +3456,7 @@ static zend_bool preload_try_resolve_constants(zend_class_entry *ce)
}
} while (changed && !ok);
EG(exception) = NULL;
+ CG(in_compilation) = 0;
return ok;
}
diff --git a/ext/opcache/tests/preload_012.phpt b/ext/opcache/tests/preload_012.phpt
new file mode 100644
index 0000000000..0883064ff4
--- /dev/null
+++ b/ext/opcache/tests/preload_012.phpt
@@ -0,0 +1,14 @@
+--TEST--
+No autoloading during constant resolution
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+opcache.optimization_level=-1
+opcache.preload={PWD}/preload_const_autoload.inc
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+===DONE===
+--EXPECTF--
+Warning: Can't preload class Test with unresolved initializer for constant C in %s on line %d
+===DONE===
diff --git a/ext/opcache/tests/preload_const_autoload.inc b/ext/opcache/tests/preload_const_autoload.inc
new file mode 100644
index 0000000000..b9634de49a
--- /dev/null
+++ b/ext/opcache/tests/preload_const_autoload.inc
@@ -0,0 +1,7 @@
+<?php
+
+spl_autoload_register(function($class) {
+ var_dump($class);
+ new Abc;
+});
+opcache_compile_file('preload_const_autoload_2.inc');
diff --git a/ext/opcache/tests/preload_const_autoload_2.inc b/ext/opcache/tests/preload_const_autoload_2.inc
new file mode 100644
index 0000000000..9367902adf
--- /dev/null
+++ b/ext/opcache/tests/preload_const_autoload_2.inc
@@ -0,0 +1,5 @@
+<?php
+
+class Test {
+ const C = Foo::BAR;
+}