Make visibilty check in is_callable() to be consistent with zend_std_get_method()

This commit is contained in:
Dmitry Stogov 2018-09-13 12:24:59 +03:00
parent 67a75a79ae
commit 72bf2def6b

View file

@ -3097,24 +3097,17 @@ static zend_always_inline int zend_is_callable_check_func(int check_flags, zval
} }
} }
} }
if ((check_flags & IS_CALLABLE_CHECK_NO_ACCESS) == 0 && if (!(fcc->function_handler->common.fn_flags & ZEND_ACC_PUBLIC) &&
!(check_flags & IS_CALLABLE_CHECK_NO_ACCESS) &&
(fcc->calling_scope && (fcc->calling_scope &&
((fcc->object && fcc->calling_scope->__call) || ((fcc->object && fcc->calling_scope->__call) ||
(!fcc->object && fcc->calling_scope->__callstatic)))) { (!fcc->object && fcc->calling_scope->__callstatic)))) {
if (fcc->function_handler->op_array.fn_flags & ZEND_ACC_PRIVATE) { scope = zend_get_executed_scope();
scope = zend_get_executed_scope(); if (fcc->function_handler->common.scope != scope
if (!zend_check_private(fcc->function_handler, fcc->object ? fcc->object->ce : scope, lmname)) { || !zend_check_protected(zend_get_function_root_class(fcc->function_handler), scope)) {
retval = 0; retval = 0;
fcc->function_handler = NULL; fcc->function_handler = NULL;
goto get_function_via_handler; goto get_function_via_handler;
}
} else if (fcc->function_handler->common.fn_flags & ZEND_ACC_PROTECTED) {
scope = zend_get_executed_scope();
if (!zend_check_protected(fcc->function_handler->common.scope, scope)) {
retval = 0;
fcc->function_handler = NULL;
goto get_function_via_handler;
}
} }
} }
} else { } else {
@ -3200,26 +3193,18 @@ get_function_via_handler:
} }
} }
} }
if (retval && (check_flags & IS_CALLABLE_CHECK_NO_ACCESS) == 0) { if (retval
if (fcc->function_handler->op_array.fn_flags & ZEND_ACC_PRIVATE) { && !(fcc->function_handler->common.fn_flags & ZEND_ACC_PUBLIC)
scope = zend_get_executed_scope(); && !(check_flags & IS_CALLABLE_CHECK_NO_ACCESS)) {
if (!zend_check_private(fcc->function_handler, fcc->object ? fcc->object->ce : scope, lmname)) { scope = zend_get_executed_scope();
if (fcc->function_handler->common.scope != scope) {
if ((fcc->function_handler->common.fn_flags & ZEND_ACC_PRIVATE)
|| (!zend_check_protected(zend_get_function_root_class(fcc->function_handler), scope))) {
if (error) { if (error) {
if (*error) { if (*error) {
efree(*error); efree(*error);
} }
zend_spprintf(error, 0, "cannot access private method %s::%s()", ZSTR_VAL(fcc->calling_scope->name), ZSTR_VAL(fcc->function_handler->common.function_name)); zend_spprintf(error, 0, "cannot access %s method %s::%s()", zend_visibility_string(fcc->function_handler->common.fn_flags), ZSTR_VAL(fcc->calling_scope->name), ZSTR_VAL(fcc->function_handler->common.function_name));
}
retval = 0;
}
} else if ((fcc->function_handler->common.fn_flags & ZEND_ACC_PROTECTED)) {
scope = zend_get_executed_scope();
if (!zend_check_protected(fcc->function_handler->common.scope, scope)) {
if (error) {
if (*error) {
efree(*error);
}
zend_spprintf(error, 0, "cannot access protected method %s::%s()", ZSTR_VAL(fcc->calling_scope->name), ZSTR_VAL(fcc->function_handler->common.function_name));
} }
retval = 0; retval = 0;
} }