From c0c40035d0c3e37bf888a71a36ba1e730f30ab57 Mon Sep 17 00:00:00 2001 From: Florian Sowade Date: Mon, 24 Oct 2022 21:37:54 +0200 Subject: [PATCH 1/2] =?UTF-8?q?Don=E2=80=99t=20reset=20func=20in=20zend=5F?= =?UTF-8?q?closure=5Finternal=5Fhandler?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The pointer is used in _zend_observe_fcall_begin(). --- Zend/zend_closures.c | 1 - Zend/zend_observer.c | 2 ++ ext/zend_test/tests/observer_closure_03.phpt | 26 ++++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 ext/zend_test/tests/observer_closure_03.phpt diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c index f697f25a0f80..2cad01772245 100644 --- a/Zend/zend_closures.c +++ b/Zend/zend_closures.c @@ -696,7 +696,6 @@ static ZEND_NAMED_FUNCTION(zend_closure_internal_handler) /* {{{ */ zend_closure *closure = (zend_closure*)ZEND_CLOSURE_OBJECT(EX(func)); closure->orig_internal_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU); OBJ_RELEASE((zend_object*)closure); - EX(func) = NULL; } /* }}} */ diff --git a/Zend/zend_observer.c b/Zend/zend_observer.c index f699ea714d83..79929bfdd80e 100644 --- a/Zend/zend_observer.c +++ b/Zend/zend_observer.c @@ -208,6 +208,7 @@ ZEND_API bool zend_observer_remove_end_handler(zend_function *function, zend_obs static inline zend_execute_data **prev_observed_frame(zend_execute_data *execute_data) { zend_function *func = EX(func); + ZEND_ASSERT(func); return (zend_execute_data **)&Z_PTR_P(EX_VAR_NUM((ZEND_USER_CODE(func->type) ? func->op_array.last_var : ZEND_CALL_NUM_ARGS(execute_data)) + func->common.T - 1)); } @@ -260,6 +261,7 @@ ZEND_API void ZEND_FASTCALL zend_observer_fcall_begin(zend_execute_data *execute static inline void call_end_observers(zend_execute_data *execute_data, zval *return_value) { zend_function *func = execute_data->func; + ZEND_ASSERT(func); zend_observer_fcall_end_handler *handler = (zend_observer_fcall_end_handler *)&ZEND_OBSERVER_DATA(func) + zend_observers_fcall_list.count; // TODO: Fix exceptions from generators diff --git a/ext/zend_test/tests/observer_closure_03.phpt b/ext/zend_test/tests/observer_closure_03.phpt new file mode 100644 index 000000000000..247dfb361f57 --- /dev/null +++ b/ext/zend_test/tests/observer_closure_03.phpt @@ -0,0 +1,26 @@ +--TEST-- +Observer: Observability of closures of builtin functions +--EXTENSIONS-- +zend_test +--INI-- +zend_test.observer.enabled=1 +zend_test.observer.observe_all=1 +--FILE-- + +--EXPECTF-- + + + + + + + +int(4) + +DONE + From 6aef7746fdce3d33eb60c3ebee075f5af8d95331 Mon Sep 17 00:00:00 2001 From: Florian Sowade Date: Mon, 24 Oct 2022 22:24:58 +0200 Subject: [PATCH 2/2] =?UTF-8?q?Don=E2=80=99t=20report=20arginfo=20violatio?= =?UTF-8?q?ns=20on=20fake=20closures?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Zend/zend_execute.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 15c356a3b4eb..d8204ca42f06 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1210,8 +1210,8 @@ static zend_never_inline ZEND_ATTRIBUTE_UNUSED bool zend_verify_internal_arg_typ * trust that arginfo matches what is enforced by zend_parse_parameters. */ ZEND_API bool zend_internal_call_should_throw(zend_function *fbc, zend_execute_data *call) { - if (fbc->internal_function.handler == ZEND_FN(pass)) { - /* Be lenient about the special pass function. */ + if (fbc->internal_function.handler == ZEND_FN(pass) || fbc->internal_function.fn_flags | ZEND_ACC_FAKE_CLOSURE) { + /* Be lenient about the special pass function and about fake closures. */ return 0; }