diff options
author | Dmitry Stogov <dmitry@php.net> | 2005-04-26 08:47:31 +0000 |
---|---|---|
committer | Dmitry Stogov <dmitry@php.net> | 2005-04-26 08:47:31 +0000 |
commit | 4f15b20b92e89e78a3bae4e48838ad1e534f7868 (patch) | |
tree | 5be8ea575812218a8efac8b665cd4c9238b6c163 /Zend | |
parent | 6e0da825281be833f4f79eb71bde65b4714deb7f (diff) | |
download | php-git-4f15b20b92e89e78a3bae4e48838ad1e534f7868.tar.gz |
Fixed bug #32429 (method_exists() always return TRUE if __call method exists)
Diffstat (limited to 'Zend')
-rw-r--r-- | Zend/tests/bug32429.phpt | 28 | ||||
-rw-r--r-- | Zend/zend_builtin_functions.c | 11 |
2 files changed, 38 insertions, 1 deletions
diff --git a/Zend/tests/bug32429.phpt b/Zend/tests/bug32429.phpt new file mode 100644 index 0000000000..db5dc7d90a --- /dev/null +++ b/Zend/tests/bug32429.phpt @@ -0,0 +1,28 @@ +--TEST-- +Bug #32429 (method_exists() always return TRUE if __call method exists) +--FILE-- +<?php + +class TestClass { + public function __construct() { + var_dump(method_exists($this, 'test')); + + if (method_exists($this, 'test')) { + $this->test(); + } + } + + public function __call($name, $args) { + throw new Exception('Call to undefined method'.get_class($this).'::'.$name.'()'); + } +} + +try { + $test = new TestClass; +} catch (Exception $e) { + exit($e->getMessage()); +} + +?> +--EXPEXT-- +bool(false) diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index efb4467c38..d5604c447b 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -880,11 +880,20 @@ ZEND_FUNCTION(method_exists) efree(lcname); RETURN_TRUE; } else { + union _zend_function *func = NULL; efree(lcname); + if (Z_TYPE_PP(klass) == IS_OBJECT && Z_OBJ_HT_PP(klass)->get_method != NULL - && Z_OBJ_HT_PP(klass)->get_method(klass, Z_STRVAL_PP(method_name), Z_STRLEN_PP(method_name) TSRMLS_CC) != NULL + && (func = Z_OBJ_HT_PP(klass)->get_method(klass, Z_STRVAL_PP(method_name), Z_STRLEN_PP(method_name) TSRMLS_CC)) != NULL ) { + if (func->type == ZEND_INTERNAL_FUNCTION + && ((zend_internal_function*)func)->handler == zend_std_call_user_call + ) { + efree(((zend_internal_function*)func)->function_name); + efree(func); + RETURN_FALSE; + } RETURN_TRUE; } } |