From: Dmitry Stogov Date: Thu, 2 Apr 2009 09:56:33 +0000 (+0000) Subject: Fixed bug #47851 (is_callable throws fatal error) X-Git-Tag: php-5.3.0RC2~227 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=875a27b7ede3d5b4e0a274017962f788d9176542;p=php Fixed bug #47851 (is_callable throws fatal error) --- diff --git a/NEWS b/NEWS index 98c2a338a8..a40a2759c8 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,7 @@ PHP NEWS - Upgraded bundled sqlite to version 3.6.12. (Scott) - Fixed bug #47856 (stristr() converts needle to lower-case). (Ilia) +- Fixed bug #47851 (is_callable throws fatal error). (Dmitry) - Fixed bug #47819 (Getting pdo_mysql.so: undefined symbol: mysqlnd_debug_init at startup). (Johannes) - Fixed bug #47816 (pcntl tests failing on NetBSD). (Matteo) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 4c81080841..b0c460606c 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -2540,12 +2540,18 @@ get_function_via_handler: fcc->object_ptr = EG(This); if (error) { zend_spprintf(error, 0, "non-static method %s::%s() %s be called statically, assuming $this from compatible context %s", fcc->calling_scope->name, fcc->function_handler->common.function_name, verb, Z_OBJCE_P(EG(This))->name); + if (severity == E_ERROR) { + retval = 0; + } } else if (retval) { zend_error(severity, "Non-static method %s::%s() %s be called statically, assuming $this from compatible context %s", fcc->calling_scope->name, fcc->function_handler->common.function_name, verb, Z_OBJCE_P(EG(This))->name); } } else { if (error) { zend_spprintf(error, 0, "non-static method %s::%s() %s be called statically", fcc->calling_scope->name, fcc->function_handler->common.function_name, verb); + if (severity == E_ERROR) { + retval = 0; + } } else if (retval) { zend_error(severity, "Non-static method %s::%s() %s be called statically", fcc->calling_scope->name, fcc->function_handler->common.function_name, verb); } diff --git a/ext/standard/tests/general_functions/bug47857.phpt b/ext/standard/tests/general_functions/bug47857.phpt new file mode 100644 index 0000000000..3bdf1c23d6 --- /dev/null +++ b/ext/standard/tests/general_functions/bug47857.phpt @@ -0,0 +1,23 @@ +--TEST-- +Bug #47851 (is_callable throws fatal error) +--FILE-- + +--EXPECTF-- +bool(true) + +Strict Standards: Non-static method foo::bar() should not be called statically in %sbug47857.php on line %d +ok +bool(false) + +Fatal error: Non-static method Exception::getMessage() cannot be called statically in %sbug47857.php on line %d + diff --git a/ext/standard/tests/general_functions/is_callable_basic2.phpt b/ext/standard/tests/general_functions/is_callable_basic2.phpt index 58443be1fb..c900032fea 100644 --- a/ext/standard/tests/general_functions/is_callable_basic2.phpt +++ b/ext/standard/tests/general_functions/is_callable_basic2.phpt @@ -210,17 +210,11 @@ object_class::func bool(false) object_class::func -- Innerloop iteration 10 of Outerloop iteration 1 -- - -Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d bool(true) bool(true) - -Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d bool(true) bool(true) object_class::foo1 - -Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d bool(true) object_class::foo1 --- Outerloop iteration 2 --- @@ -297,17 +291,11 @@ no_member_class::func bool(false) no_member_class::func -- Innerloop iteration 10 of Outerloop iteration 2 -- - -Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d bool(true) bool(true) - -Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d bool(true) bool(true) object_class::foo1 - -Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d bool(true) object_class::foo1 --- Outerloop iteration 3 --- @@ -384,17 +372,11 @@ contains_object_class::func bool(true) contains_object_class::func -- Innerloop iteration 10 of Outerloop iteration 3 -- - -Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d bool(true) bool(true) - -Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d bool(true) bool(true) object_class::foo1 - -Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d bool(true) object_class::foo1 --- Outerloop iteration 4 --- @@ -471,17 +453,11 @@ contains_object_class::func bool(true) contains_object_class::func -- Innerloop iteration 10 of Outerloop iteration 4 -- - -Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d bool(true) bool(true) - -Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d bool(true) bool(true) object_class::foo1 - -Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d bool(true) object_class::foo1 --- Outerloop iteration 5 --- @@ -558,17 +534,11 @@ object_class::func bool(false) object_class::func -- Innerloop iteration 10 of Outerloop iteration 5 -- - -Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d bool(true) bool(true) - -Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d bool(true) bool(true) object_class::foo1 - -Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d bool(true) object_class::foo1 --- Outerloop iteration 6 --- @@ -645,17 +615,11 @@ no_member_class::func bool(false) no_member_class::func -- Innerloop iteration 10 of Outerloop iteration 6 -- - -Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d bool(true) bool(true) - -Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d bool(true) bool(true) object_class::foo1 - -Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d bool(true) object_class::foo1 --- Outerloop iteration 7 --- @@ -732,17 +696,11 @@ object_class::func bool(false) object_class::func -- Innerloop iteration 10 of Outerloop iteration 7 -- - -Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d bool(true) bool(true) - -Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d bool(true) bool(true) object_class::foo1 - -Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d bool(true) object_class::foo1 --- Outerloop iteration 8 --- @@ -819,17 +777,11 @@ Array bool(false) Array -- Innerloop iteration 10 of Outerloop iteration 8 -- - -Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d bool(true) bool(true) - -Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d bool(true) bool(true) object_class::foo1 - -Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d bool(true) object_class::foo1 ===DONE=== \ No newline at end of file diff --git a/ext/standard/type.c b/ext/standard/type.c index de64b86a76..a21df63e1b 100644 --- a/ext/standard/type.c +++ b/ext/standard/type.c @@ -358,21 +358,29 @@ PHP_FUNCTION(is_callable) { zval *var, **callable_name = NULL; char *name; + char *error; zend_bool retval; zend_bool syntax_only = 0; + int check_flags = 0; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|bZ", &var, &syntax_only, &callable_name) == FAILURE) { return; } - - syntax_only = syntax_only ? IS_CALLABLE_CHECK_SYNTAX_ONLY : 0; + + if (syntax_only) { + check_flags |= IS_CALLABLE_CHECK_SYNTAX_ONLY; + } if (ZEND_NUM_ARGS() > 2) { - retval = zend_is_callable(var, syntax_only, &name TSRMLS_CC); + retval = zend_is_callable_ex(var, NULL, check_flags, &name, NULL, NULL, &error TSRMLS_CC); zval_dtor(*callable_name); ZVAL_STRING(*callable_name, name, 0); } else { - retval = zend_is_callable(var, syntax_only, NULL TSRMLS_CC); + retval = zend_is_callable_ex(var, NULL, check_flags, NULL, NULL, NULL, &error TSRMLS_CC); + } + if (error) { + /* ignore errors */ + efree(error); } RETURN_BOOL(retval);