From 23ae6ca405f7133d8882e9957df69980362906ad Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 2 Jul 2018 21:33:09 +0200 Subject: [PATCH] Fix check for invoking abstract method --- ext/reflection/php_reflection.c | 28 +++++++++---------- ...n_abstract_method_after_setAccessible.phpt | 20 +++++++++++++ 2 files changed, 33 insertions(+), 15 deletions(-) create mode 100644 ext/reflection/tests/ReflectionMethod_invoke_on_abstract_method_after_setAccessible.phpt diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 7a313813a9..03590d47e7 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -3089,21 +3089,19 @@ static void reflection_method_invoke(INTERNAL_FUNCTION_PARAMETERS, int variadic) GET_REFLECTION_OBJECT_PTR(mptr); - if ((!(mptr->common.fn_flags & ZEND_ACC_PUBLIC) - || (mptr->common.fn_flags & ZEND_ACC_ABSTRACT)) - && intern->ignore_visibility == 0) - { - if (mptr->common.fn_flags & ZEND_ACC_ABSTRACT) { - zend_throw_exception_ex(reflection_exception_ptr, 0, - "Trying to invoke abstract method %s::%s()", - ZSTR_VAL(mptr->common.scope->name), ZSTR_VAL(mptr->common.function_name)); - } else { - zend_throw_exception_ex(reflection_exception_ptr, 0, - "Trying to invoke %s method %s::%s() from scope %s", - mptr->common.fn_flags & ZEND_ACC_PROTECTED ? "protected" : "private", - ZSTR_VAL(mptr->common.scope->name), ZSTR_VAL(mptr->common.function_name), - ZSTR_VAL(Z_OBJCE_P(getThis())->name)); - } + if (mptr->common.fn_flags & ZEND_ACC_ABSTRACT) { + zend_throw_exception_ex(reflection_exception_ptr, 0, + "Trying to invoke abstract method %s::%s()", + ZSTR_VAL(mptr->common.scope->name), ZSTR_VAL(mptr->common.function_name)); + return; + } + + if (!(mptr->common.fn_flags & ZEND_ACC_PUBLIC) && intern->ignore_visibility == 0) { + zend_throw_exception_ex(reflection_exception_ptr, 0, + "Trying to invoke %s method %s::%s() from scope %s", + mptr->common.fn_flags & ZEND_ACC_PROTECTED ? "protected" : "private", + ZSTR_VAL(mptr->common.scope->name), ZSTR_VAL(mptr->common.function_name), + ZSTR_VAL(Z_OBJCE_P(getThis())->name)); return; } diff --git a/ext/reflection/tests/ReflectionMethod_invoke_on_abstract_method_after_setAccessible.phpt b/ext/reflection/tests/ReflectionMethod_invoke_on_abstract_method_after_setAccessible.phpt new file mode 100644 index 0000000000..c564d6c16b --- /dev/null +++ b/ext/reflection/tests/ReflectionMethod_invoke_on_abstract_method_after_setAccessible.phpt @@ -0,0 +1,20 @@ +--TEST-- +ReflectionMethod::invoke() on an abstract method should fail even after calling setAccessible(true) +--FILE-- +setAccessible(true); +try { + var_dump($rm->invoke(null)); +} catch (ReflectionException $e) { + echo $e->getMessage(), "\n"; +} + +?> +--EXPECT-- +Trying to invoke abstract method Test::foo() -- 2.50.0