mirror of
https://github.com/php/php-src.git
synced 2025-01-27 06:03:45 +08:00
- Fixed bug #36011
This commit is contained in:
parent
61a80cf37b
commit
2fe859febb
@ -2601,7 +2601,7 @@ ZEND_API int zend_disable_class(char *class_name, uint class_name_length TSRMLS_
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int zend_is_callable_check_func(int check_flags, zval **zobj_ptr, zend_class_entry *ce_org, zval *callable, zend_class_entry **ce_ptr, zend_function **fptr_ptr TSRMLS_DC)
|
||||
static int zend_is_callable_check_func(int check_flags, zval ***zobj_ptr_ptr, zend_class_entry *ce_org, zval *callable, zend_class_entry **ce_ptr, zend_function **fptr_ptr TSRMLS_DC)
|
||||
{
|
||||
int retval;
|
||||
char *lcname, *lmname, *mname, *colon;
|
||||
@ -2660,14 +2660,14 @@ static int zend_is_callable_check_func(int check_flags, zval **zobj_ptr, zend_cl
|
||||
retval = zend_hash_find(ftable, lmname, mlen+1, (void**)&fptr) == SUCCESS ? 1 : 0;
|
||||
|
||||
if (!retval) {
|
||||
if (zobj_ptr && *ce_ptr && (*ce_ptr)->__call != 0) {
|
||||
if (*zobj_ptr_ptr && *ce_ptr && (*ce_ptr)->__call != 0) {
|
||||
retval = (*ce_ptr)->__call != NULL;
|
||||
*fptr_ptr = (*ce_ptr)->__call;
|
||||
}
|
||||
} else {
|
||||
*fptr_ptr = fptr;
|
||||
if (*ce_ptr) {
|
||||
if (!zobj_ptr && !(fptr->common.fn_flags & ZEND_ACC_STATIC)) {
|
||||
if (!*zobj_ptr_ptr && !(fptr->common.fn_flags & ZEND_ACC_STATIC)) {
|
||||
if ((check_flags & IS_CALLABLE_CHECK_IS_STATIC) != 0) {
|
||||
retval = 0;
|
||||
} else {
|
||||
@ -2676,7 +2676,7 @@ static int zend_is_callable_check_func(int check_flags, zval **zobj_ptr, zend_cl
|
||||
}
|
||||
if (retval && (check_flags & IS_CALLABLE_CHECK_NO_ACCESS) == 0) {
|
||||
if (fptr->op_array.fn_flags & ZEND_ACC_PRIVATE) {
|
||||
if (!zend_check_private(fptr, zobj_ptr ? Z_OBJCE_PP(zobj_ptr) : EG(scope), lmname, mlen TSRMLS_CC)) {
|
||||
if (!zend_check_private(fptr, *zobj_ptr_ptr ? Z_OBJCE_PP(*zobj_ptr_ptr) : EG(scope), lmname, mlen TSRMLS_CC)) {
|
||||
retval = 0;
|
||||
}
|
||||
} else if ((fptr->common.fn_flags & ZEND_ACC_PROTECTED)) {
|
||||
@ -2724,7 +2724,7 @@ ZEND_API zend_bool zend_is_callable_ex(zval *callable, uint check_flags, zval *c
|
||||
return 1;
|
||||
}
|
||||
|
||||
return zend_is_callable_check_func(check_flags|IS_CALLABLE_CHECK_IS_STATIC, NULL, NULL, callable, ce_ptr, fptr_ptr TSRMLS_CC);
|
||||
return zend_is_callable_check_func(check_flags|IS_CALLABLE_CHECK_IS_STATIC, zobj_ptr_ptr, NULL, callable, ce_ptr, fptr_ptr TSRMLS_CC);
|
||||
|
||||
case IS_ARRAY:
|
||||
{
|
||||
@ -2815,13 +2815,6 @@ ZEND_API zend_bool zend_is_callable_ex(zval *callable, uint check_flags, zval *c
|
||||
} else if (zend_u_lookup_class(Z_TYPE_PP(obj), Z_UNIVAL_PP(obj), Z_UNILEN_PP(obj), &pce TSRMLS_CC) == SUCCESS) {
|
||||
ce = *pce;
|
||||
}
|
||||
if (EG(This)) {
|
||||
if (instanceof_function(Z_OBJCE_P(EG(This)), ce TSRMLS_CC)) {
|
||||
*zobj_ptr_ptr = &EG(This);
|
||||
zend_error(E_STRICT, "Non-static method %v::%R() cannot be called statically, assuming $this from compatible context %s", ce->name, Z_TYPE_PP(method), Z_STRVAL_PP(method), Z_OBJCE_P(EG(This))->name);
|
||||
}
|
||||
}
|
||||
|
||||
efree(lcname);
|
||||
} else {
|
||||
ce = Z_OBJCE_PP(obj); /* TBFixed: what if it's overloaded? */
|
||||
@ -2873,7 +2866,7 @@ ZEND_API zend_bool zend_is_callable_ex(zval *callable, uint check_flags, zval *c
|
||||
}
|
||||
|
||||
if (ce) {
|
||||
return zend_is_callable_check_func(check_flags, *zobj_ptr_ptr, ce, *method, ce_ptr, fptr_ptr TSRMLS_CC);
|
||||
return zend_is_callable_check_func(check_flags, zobj_ptr_ptr, ce, *method, ce_ptr, fptr_ptr TSRMLS_CC);
|
||||
}
|
||||
} else if (callable_name) {
|
||||
ZVAL_ASCII_STRINGL(callable_name, "Array", sizeof("Array")-1, 1);
|
||||
|
46
ext/standard/tests/general_functions/bug36011.phpt
Executable file
46
ext/standard/tests/general_functions/bug36011.phpt
Executable file
@ -0,0 +1,46 @@
|
||||
--TEST--
|
||||
Bug #36011 (Strict errormsg wrong for call_user_func() and the likes)
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
class TestClass
|
||||
{
|
||||
static function test()
|
||||
{
|
||||
echo __METHOD__ . "()\n";
|
||||
}
|
||||
|
||||
function whee()
|
||||
{
|
||||
array_map(array('TestClass', 'test'), array('array_value'));
|
||||
}
|
||||
|
||||
function whee4()
|
||||
{
|
||||
call_user_func(array('TestClass', 'test'));
|
||||
}
|
||||
|
||||
static function whee5()
|
||||
{
|
||||
call_user_func(array('TestClass', 'test'));
|
||||
}
|
||||
}
|
||||
|
||||
TestClass::test();
|
||||
|
||||
$a = new TestClass();
|
||||
$a->whee();
|
||||
$a->whee4();
|
||||
$a->whee5();
|
||||
|
||||
TestClass::whee5();
|
||||
|
||||
?>
|
||||
===DONE===
|
||||
--EXPECTF--
|
||||
TestClass::test()
|
||||
TestClass::test()
|
||||
TestClass::test()
|
||||
TestClass::test()
|
||||
TestClass::test()
|
||||
===DONE===
|
Loading…
Reference in New Issue
Block a user