--- /dev/null
+--TEST--
+Bug #32290 (calling call_user_func_array() ends in infinite loop within child class)
+--FILE--
+<?php
+
+class TestA
+{
+ public function doSomething($i)
+ {
+ echo __METHOD__ . "($this)\n";
+ return --$i;
+ }
+}
+
+class TestB extends TestA
+{
+ public function doSomething($i)
+ {
+ echo __METHOD__ . "($this)\n";
+ $i++;
+ if ($i >= 5) return 5;
+ return call_user_func_array(array("TestA","doSomething"), array($i));
+ }
+}
+
+$x = new TestB();
+var_dump($x->doSomething(1));
+
+?>
+===DONE===
+--EXPECTF--
+TestB::doSomething(Object id #%d)
+TestA::doSomething(Object id #%d)
+int(1)
+===DONE===
}
EX(function_state).function =
Z_OBJ_HT_PP(fci->object_pp)->get_method(*fci->object_pp, Z_STRVAL_P(fci->function_name), Z_STRLEN_P(fci->function_name) TSRMLS_CC);
+ if (EX(function_state).function && calling_scope != EX(function_state).function->common.scope) {
+ char *function_name_lc = zend_str_tolower_dup(Z_STRVAL_P(fci->function_name), Z_STRLEN_P(fci->function_name));
+ if (zend_hash_find(&calling_scope->function_table, function_name_lc, fci->function_name->value.str.len+1, (void **) &EX(function_state).function)==FAILURE) {
+ efree(function_name_lc);
+ zend_error(E_ERROR, "Cannot call method %s::%s() or method does not exist", calling_scope->name, Z_STRVAL_P(fci->function_name));
+ }
+ efree(function_name_lc);
+ }
} else if (calling_scope) {
char *function_name_lc = zend_str_tolower_dup(Z_STRVAL_P(fci->function_name), Z_STRLEN_P(fci->function_name));
}
if ((ref->prop->flags & ZEND_ACC_STATIC)) {
+ zend_update_class_constants(intern->ce TSRMLS_CC);
if (zend_hash_quick_find(intern->ce->static_members, ref->prop->name, ref->prop->name_length + 1, ref->prop->h, (void **) &member) == FAILURE) {
zend_error(E_ERROR, "Internal error: Could not find the property %s", ref->prop->name);
/* Bails out */
}
if ((ref->prop->flags & ZEND_ACC_STATIC)) {
+ zend_update_class_constants(intern->ce TSRMLS_CC);
if (zend_hash_quick_find(intern->ce->static_members, ref->prop->name, ref->prop->name_length + 1, ref->prop->h, (void **) &member) == FAILURE) {
zend_error(E_ERROR, "Internal error: Could not find the property %s", ref->prop->name);
/* Bails out */