From a8ae88162fe2ee2f9ca9846ff62c1d4d0d141a6a Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Tue, 13 Oct 2015 17:40:58 +0800 Subject: [PATCH] Fixed bug #70689 (Exception handler does not work as expected) --- NEWS | 3 ++- Zend/tests/bug70689.phpt | 22 ++++++++++++++++++++++ Zend/zend_execute.c | 8 +++----- Zend/zend_execute.h | 2 +- Zend/zend_vm_def.h | 5 ++--- Zend/zend_vm_execute.h | 5 ++--- 6 files changed, 32 insertions(+), 13 deletions(-) create mode 100644 Zend/tests/bug70689.phpt diff --git a/NEWS b/NEWS index 480dcd28c7..0615114ebf 100644 --- a/NEWS +++ b/NEWS @@ -2,7 +2,8 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| 29 Oct 2015, PHP 7.0.0 RC 6 - +- Core: + . Fixed bug #70689 (Exception handler does not work as expected). (Laruence) 15 Oct 2015, PHP 7.0.0 RC 5 diff --git a/Zend/tests/bug70689.phpt b/Zend/tests/bug70689.phpt new file mode 100644 index 0000000000..e3feeed9b0 --- /dev/null +++ b/Zend/tests/bug70689.phpt @@ -0,0 +1,22 @@ +--TEST-- +Bug #70689 (Exception handler does not work as expected) +--FILE-- +getMessage(), "\n"; +} + +?> +--EXPECTF-- +Missing argument 1 for foo(), called in %sbug70689.php on line %d and defined diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 5b98fb47fb..bbeab75175 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -893,7 +893,7 @@ static zend_always_inline int zend_verify_missing_arg_type(zend_function *zf, ui return 1; } -static ZEND_COLD int zend_verify_missing_arg(zend_execute_data *execute_data, uint32_t arg_num, void **cache_slot) +static ZEND_COLD void zend_verify_missing_arg(zend_execute_data *execute_data, uint32_t arg_num, void **cache_slot) { if (EXPECTED(!(EX(func)->common.fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) || UNEXPECTED(zend_verify_missing_arg_type(EX(func), arg_num, cache_slot))) { @@ -907,9 +907,7 @@ static ZEND_COLD int zend_verify_missing_arg(zend_execute_data *execute_data, ui } else { zend_error(E_WARNING, "Missing argument %u for %s%s%s()", arg_num, class_name, space, func_name); } - return 1; } - return 0; } static ZEND_COLD void zend_verify_return_error(const zend_function *zf, const char *need_msg, const char *need_kind, const char *returned_msg, const char *returned_kind) @@ -2736,9 +2734,9 @@ ZEND_API int ZEND_FASTCALL zend_check_arg_type(zend_function *zf, uint32_t arg_n return zend_verify_arg_type(zf, arg_num, arg, default_value, cache_slot); } -ZEND_API int ZEND_FASTCALL zend_check_missing_arg(zend_execute_data *execute_data, uint32_t arg_num, void **cache_slot) +ZEND_API void ZEND_FASTCALL zend_check_missing_arg(zend_execute_data *execute_data, uint32_t arg_num, void **cache_slot) { - return zend_verify_missing_arg(execute_data, arg_num, cache_slot); + zend_verify_missing_arg(execute_data, arg_num, cache_slot); } /* diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 47b68b37d1..50b2af173e 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -52,7 +52,7 @@ ZEND_API int zend_eval_stringl_ex(char *str, size_t str_len, zval *retval_ptr, c ZEND_API void ZEND_FASTCALL zend_check_internal_arg_type(zend_function *zf, uint32_t arg_num, zval *arg); ZEND_API int ZEND_FASTCALL zend_check_arg_type(zend_function *zf, uint32_t arg_num, zval *arg, zval *default_value, void **cache_slot); -ZEND_API int ZEND_FASTCALL zend_check_missing_arg(zend_execute_data *execute_data, uint32_t arg_num, void **cache_slot); +ZEND_API void ZEND_FASTCALL zend_check_missing_arg(zend_execute_data *execute_data, uint32_t arg_num, void **cache_slot); static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value, zend_uchar value_type) { diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 0c34f1717b..f9739445f5 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -4714,9 +4714,8 @@ ZEND_VM_HANDLER(63, ZEND_RECV, ANY, ANY) if (UNEXPECTED(arg_num > EX_NUM_ARGS())) { SAVE_OPLINE(); - if (UNEXPECTED(!zend_verify_missing_arg(execute_data, arg_num, CACHE_ADDR(opline->op2.num)))) { - HANDLE_EXCEPTION(); - } + zend_verify_missing_arg(execute_data, arg_num, CACHE_ADDR(opline->op2.num)); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) { zval *param = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->result.var); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 031e234281..728fc49c8f 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -1204,9 +1204,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RECV_SPEC_HANDLER(ZEND_OPCODE_ if (UNEXPECTED(arg_num > EX_NUM_ARGS())) { SAVE_OPLINE(); - if (UNEXPECTED(!zend_verify_missing_arg(execute_data, arg_num, CACHE_ADDR(opline->op2.num)))) { - HANDLE_EXCEPTION(); - } + zend_verify_missing_arg(execute_data, arg_num, CACHE_ADDR(opline->op2.num)); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) { zval *param = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->result.var); -- 2.49.0