Skip to content

Commit

Permalink
Fix bug #66719
Browse files Browse the repository at this point in the history
While parent:: should inherit the called scope, it should only do
so if it is compatible. If there is no called scope, or it is not
a subtype of the scope, we should fall back to the scope.
  • Loading branch information
nikic committed Jul 23, 2021
1 parent 760ff84 commit dfd05da
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 0 deletions.
2 changes: 2 additions & 0 deletions NEWS
Expand Up @@ -4,6 +4,8 @@ PHP NEWS

- Core:
. Fixed bug #72595 (php_output_handler_append illegal write access). (cmb)
. Fixed bug #66719 (Weird behaviour when using get_called_class() with
call_user_func()). (Nikita)

- BCMath:
. Fixed bug #78238 (BCMath returns "-0"). (cmb)
Expand Down
43 changes: 43 additions & 0 deletions Zend/tests/bug66719.phpt
@@ -0,0 +1,43 @@
--TEST--
Bug #66719: Weird behaviour when using get_called_class() with call_user_func()
--FILE--
<?php

class A
{
public static function who()
{
var_dump(get_called_class());
}
}
class B extends A
{
public static function who()
{
parent::who();
}
}

class C
{
public static function test() {
B::who();
call_user_func(array(A::class, 'who'));
call_user_func(array(B::class, 'parent::who'));
}
}

B::who();
call_user_func(array(A::class, 'who'));
call_user_func(array(B::class, 'parent::who'));

C::test();

?>
--EXPECT--
string(1) "B"
string(1) "A"
string(1) "A"
string(1) "B"
string(1) "A"
string(1) "A"
6 changes: 6 additions & 0 deletions Zend/zend_API.c
Expand Up @@ -2922,6 +2922,9 @@ static int zend_is_callable_check_class(zend_string *name, zend_class_entry *sco
if (error) *error = estrdup("cannot access self:: when no class scope is active");
} else {
fcc->called_scope = zend_get_called_scope(EG(current_execute_data));
if (!fcc->called_scope || !instanceof_function(fcc->called_scope, scope)) {
fcc->called_scope = scope;
}
fcc->calling_scope = scope;
if (!fcc->object) {
fcc->object = zend_get_this_object(EG(current_execute_data));
Expand All @@ -2935,6 +2938,9 @@ static int zend_is_callable_check_class(zend_string *name, zend_class_entry *sco
if (error) *error = estrdup("cannot access parent:: when current class scope has no parent");
} else {
fcc->called_scope = zend_get_called_scope(EG(current_execute_data));
if (!fcc->called_scope || !instanceof_function(fcc->called_scope, scope->parent)) {
fcc->called_scope = scope->parent;
}
fcc->calling_scope = scope->parent;
if (!fcc->object) {
fcc->object = zend_get_this_object(EG(current_execute_data));
Expand Down

0 comments on commit dfd05da

Please sign in to comment.