Skip to content

Commit 709540c

Browse files
committed
Fix add/remove observer API with multiple observers installed
Depending on the order in which observers were installed, some observers might have been executed twice after removal of another observer. Also, adding an observer could produce a bogus pointer.
1 parent 42619b2 commit 709540c

File tree

1 file changed

+2
-3
lines changed

1 file changed

+2
-3
lines changed

Zend/zend_observer.c

+2-3
Original file line numberDiff line numberDiff line change
@@ -158,9 +158,8 @@ static bool zend_observer_remove_handler(void **first_handler, void *old_handler
158158
} else {
159159
if (cur_handler != last_handler) {
160160
memmove(cur_handler, cur_handler + 1, sizeof(cur_handler) * (last_handler - cur_handler));
161-
} else {
162-
*last_handler = NULL;
163161
}
162+
*last_handler = NULL;
164163
}
165164
return true;
166165
}
@@ -196,7 +195,7 @@ ZEND_API void zend_observer_add_end_handler(zend_function *function, zend_observ
196195
if (*end_handler != ZEND_OBSERVER_NOT_OBSERVED) {
197196
// there's no space for new handlers, then it's forbidden to call this function
198197
ZEND_ASSERT(end_handler[registered_observers - 1] == NULL);
199-
memmove(end_handler + 1, end_handler, registered_observers - 1);
198+
memmove(end_handler + 1, end_handler, sizeof(end_handler) * (registered_observers - 1));
200199
}
201200
*end_handler = end;
202201
}

0 commit comments

Comments
 (0)