From: Marcus Boerger Date: Sat, 14 Jan 2006 15:22:19 +0000 (+0000) Subject: - Fixed bug #36011 X-Git-Tag: RELEASE_1_0_4~29 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2fe859febbff953a36972661a3177cb0c97e9a8f;p=php - Fixed bug #36011 --- diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 7fa7472b44..3d1de56b60 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -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); diff --git a/ext/standard/tests/general_functions/bug36011.phpt b/ext/standard/tests/general_functions/bug36011.phpt new file mode 100755 index 0000000000..08a45014f2 --- /dev/null +++ b/ext/standard/tests/general_functions/bug36011.phpt @@ -0,0 +1,46 @@ +--TEST-- +Bug #36011 (Strict errormsg wrong for call_user_func() and the likes) +--FILE-- +whee(); +$a->whee4(); +$a->whee5(); + +TestClass::whee5(); + +?> +===DONE=== +--EXPECTF-- +TestClass::test() +TestClass::test() +TestClass::test() +TestClass::test() +TestClass::test() +===DONE===