]> granicus.if.org Git - php/commitdiff
Fix called scope assignment in autoloader
authorNikita Popov <nikita.ppv@gmail.com>
Wed, 10 Jun 2020 07:55:50 +0000 (09:55 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Wed, 10 Jun 2020 07:55:50 +0000 (09:55 +0200)
We should use the scope specified in the spl_autoload_register()
call, not whatever LSB scope just so happens to be active at the
time of the autoloader call.

ext/spl/php_spl.c
ext/spl/tests/spl_autoload_called_scope.phpt [new file with mode: 0644]

index f55e337ab2df01089444435aa1b1f9960e6410a8..4e49141555e4f93c8f090a65f23219c205e3a3f9 100644 (file)
@@ -403,7 +403,6 @@ static zend_class_entry *spl_perform_autoload(zend_string *class_name, zend_stri
        zval params[1];
        zval retval;
        zend_string *func_name;
-       zend_class_entry *called_scope = zend_get_called_scope(EG(current_execute_data));
 
        fci.size = sizeof(fci);
        fci.retval = &retval;
@@ -431,13 +430,7 @@ static zend_class_entry *spl_perform_autoload(zend_string *class_name, zend_stri
                if (Z_ISUNDEF(alfi->obj)) {
                        fci.object = NULL;
                        fcic.object = NULL;
-                       if (alfi->ce &&
-                               (!called_scope ||
-                                !instanceof_function(called_scope, alfi->ce))) {
-                               fcic.called_scope = alfi->ce;
-                       } else {
-                               fcic.called_scope = called_scope;
-                       }
+                       fcic.called_scope = alfi->ce;
                } else {
                        fci.object = Z_OBJ(alfi->obj);
                        fcic.object = Z_OBJ(alfi->obj);
diff --git a/ext/spl/tests/spl_autoload_called_scope.phpt b/ext/spl/tests/spl_autoload_called_scope.phpt
new file mode 100644 (file)
index 0000000..23f2e84
--- /dev/null
@@ -0,0 +1,33 @@
+--TEST--
+SPL autoloader should not do anything magic with called scope
+--FILE--
+<?php
+
+class Test {
+    public static function register() {
+        spl_autoload_register([Test::class, 'autoload']);
+    }
+
+    public static function autoload($class) {
+        echo "self=" . self::class, ", static=", static::class, "\n";
+    }
+}
+
+class Test2 extends Test {
+    public static function register() {
+        spl_autoload_register([Test2::class, 'autoload']);
+    }
+
+    public static function runTest() {
+        class_exists('FooBar');
+    }
+}
+
+Test::register();
+Test2::register();
+Test2::runTest();
+
+?>
+--EXPECT--
+self=Test, static=Test
+self=Test, static=Test2