Skip to content

Commit 8dabbda

Browse files
rioderelftebwoebi
authored andcommitted
Don’t reset func in zend_closure_internal_handler
The pointer is used in _zend_observe_fcall_begin().
1 parent 6051362 commit 8dabbda

File tree

3 files changed

+28
-1
lines changed

3 files changed

+28
-1
lines changed

Zend/zend_closures.c

-1
Original file line numberDiff line numberDiff line change
@@ -696,7 +696,6 @@ static ZEND_NAMED_FUNCTION(zend_closure_internal_handler) /* {{{ */
696696
zend_closure *closure = (zend_closure*)ZEND_CLOSURE_OBJECT(EX(func));
697697
closure->orig_internal_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU);
698698
OBJ_RELEASE((zend_object*)closure);
699-
EX(func) = NULL;
700699
}
701700
/* }}} */
702701

Zend/zend_observer.c

+2
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,7 @@ ZEND_API bool zend_observer_remove_end_handler(zend_function *function, zend_obs
208208

209209
static inline zend_execute_data **prev_observed_frame(zend_execute_data *execute_data) {
210210
zend_function *func = EX(func);
211+
ZEND_ASSERT(func);
211212
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));
212213
}
213214

@@ -260,6 +261,7 @@ ZEND_API void ZEND_FASTCALL zend_observer_fcall_begin(zend_execute_data *execute
260261

261262
static inline void call_end_observers(zend_execute_data *execute_data, zval *return_value) {
262263
zend_function *func = execute_data->func;
264+
ZEND_ASSERT(func);
263265

264266
zend_observer_fcall_end_handler *handler = (zend_observer_fcall_end_handler *)&ZEND_OBSERVER_DATA(func) + zend_observers_fcall_list.count;
265267
// TODO: Fix exceptions from generators
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
--TEST--
2+
Observer: Observability of closures of builtin functions
3+
--EXTENSIONS--
4+
zend_test
5+
--INI--
6+
zend_test.observer.enabled=1
7+
zend_test.observer.observe_all=1
8+
--FILE--
9+
<?php
10+
$closure = strlen(...);
11+
var_dump($closure('test'));
12+
13+
echo 'DONE' . PHP_EOL;
14+
?>
15+
--EXPECTF--
16+
<!-- init '%s' -->
17+
<file '%s'>
18+
<!-- init strlen() -->
19+
<strlen>
20+
</strlen>
21+
<!-- init var_dump() -->
22+
<var_dump>
23+
int(4)
24+
</var_dump>
25+
DONE
26+
</file '%s'>

0 commit comments

Comments
 (0)