summaryrefslogtreecommitdiff
path: root/Zend/zend_builtin_functions.c
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2018-09-19 09:37:04 +0200
committerNikita Popov <nikita.ppv@gmail.com>2018-09-19 09:37:04 +0200
commit294fb83ee84b76479a62e4ed37d5523c1208ad7c (patch)
tree2a97de67c347171d0c80199f19e72d7a961e65ba /Zend/zend_builtin_functions.c
parentab6c45f5249d077463c1876d7cf09a11f04240fa (diff)
downloadphp-git-294fb83ee84b76479a62e4ed37d5523c1208ad7c.tar.gz
Fixed bug #76901
get_method() may modify the object pointer passed to it if method forwarding is used. In this case we do not want to modify the passed zval, so make sure that we copy the object into a temporary first.
Diffstat (limited to 'Zend/zend_builtin_functions.c')
-rw-r--r--Zend/zend_builtin_functions.c11
1 files changed, 4 insertions, 7 deletions
diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c
index 184b352ec8..f792756a11 100644
--- a/Zend/zend_builtin_functions.c
+++ b/Zend/zend_builtin_functions.c
@@ -1400,13 +1400,10 @@ ZEND_FUNCTION(method_exists)
if (zend_hash_exists(&ce->function_table, lcname)) {
zend_string_release(lcname);
RETURN_TRUE;
- } else {
- union _zend_function *func = NULL;
-
- if (Z_TYPE_P(klass) == IS_OBJECT
- && Z_OBJ_HT_P(klass)->get_method != NULL
- && (func = Z_OBJ_HT_P(klass)->get_method(&Z_OBJ_P(klass), method_name, NULL)) != NULL
- ) {
+ } else if (Z_TYPE_P(klass) == IS_OBJECT && Z_OBJ_HT_P(klass)->get_method != NULL) {
+ zend_object *obj = Z_OBJ_P(klass);
+ zend_function *func = Z_OBJ_HT_P(klass)->get_method(&obj, method_name, NULL);
+ if (func != NULL) {
if (func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE) {
/* Returns true to the fake Closure's __invoke */
RETVAL_BOOL(func->common.scope == zend_ce_closure