Skip to content

Commit ad436f6

Browse files
committed
Fix GH-16414: Segmentation fault in Zend/zend_observer.c
1 parent 5955ce8 commit ad436f6

File tree

2 files changed

+16
-0
lines changed

2 files changed

+16
-0
lines changed

Zend/zend_observer.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,9 @@ static bool zend_observer_remove_handler(void **first_handler, void *old_handler
169169

170170
ZEND_API void zend_observer_add_begin_handler(zend_function *function, zend_observer_fcall_begin_handler begin) {
171171
size_t registered_observers = zend_observers_fcall_list.count;
172+
if (registered_observers == 0) {
173+
return;
174+
}
172175
zend_observer_fcall_begin_handler *first_handler = (void *)&ZEND_OBSERVER_DATA(function), *last_handler = first_handler + registered_observers - 1;
173176
if (*first_handler == ZEND_OBSERVER_NOT_OBSERVED) {
174177
*first_handler = begin;
@@ -190,6 +193,9 @@ ZEND_API bool zend_observer_remove_begin_handler(zend_function *function, zend_o
190193

191194
ZEND_API void zend_observer_add_end_handler(zend_function *function, zend_observer_fcall_end_handler end) {
192195
size_t registered_observers = zend_observers_fcall_list.count;
196+
if (registered_observers == 0) {
197+
return;
198+
}
193199
zend_observer_fcall_end_handler *end_handler = (zend_observer_fcall_end_handler *)&ZEND_OBSERVER_DATA(function) + registered_observers;
194200
// to allow to preserve the invariant that end handlers are in reverse order of begin handlers, push the new end handler in front
195201
if (*end_handler != ZEND_OBSERVER_NOT_OBSERVED) {

ext/zend_test/tests/gh16414.phpt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
--TEST--
2+
GH-16414 (Segmentation fault in Zend/zend_observer.c)
3+
--EXTENSIONS--
4+
zend_test
5+
--FILE--
6+
<?php
7+
function bar() {}
8+
ini_set("zend_test.observer.observe_function_names", "bar");
9+
?>
10+
--EXPECT--

0 commit comments

Comments
 (0)