summaryrefslogtreecommitdiff
path: root/Zend
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@php.net>2005-04-26 08:47:31 +0000
committerDmitry Stogov <dmitry@php.net>2005-04-26 08:47:31 +0000
commit4f15b20b92e89e78a3bae4e48838ad1e534f7868 (patch)
tree5be8ea575812218a8efac8b665cd4c9238b6c163 /Zend
parent6e0da825281be833f4f79eb71bde65b4714deb7f (diff)
downloadphp-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.phpt28
-rw-r--r--Zend/zend_builtin_functions.c11
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;
}
}