Skip to content

Commit

Permalink
Fix add/remove observer API with multiple observers installed
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
bwoebi committed Jun 9, 2023
1 parent 42619b2 commit 709540c
Showing 1 changed file with 2 additions and 3 deletions.
5 changes: 2 additions & 3 deletions Zend/zend_observer.c
Expand Up @@ -158,9 +158,8 @@ static bool zend_observer_remove_handler(void **first_handler, void *old_handler
} else {
if (cur_handler != last_handler) {
memmove(cur_handler, cur_handler + 1, sizeof(cur_handler) * (last_handler - cur_handler));
} else {
*last_handler = NULL;
}
*last_handler = NULL;
}
return true;
}
Expand Down Expand Up @@ -196,7 +195,7 @@ ZEND_API void zend_observer_add_end_handler(zend_function *function, zend_observ
if (*end_handler != ZEND_OBSERVER_NOT_OBSERVED) {
// there's no space for new handlers, then it's forbidden to call this function
ZEND_ASSERT(end_handler[registered_observers - 1] == NULL);
memmove(end_handler + 1, end_handler, registered_observers - 1);
memmove(end_handler + 1, end_handler, sizeof(end_handler) * (registered_observers - 1));
}
*end_handler = end;
}
Expand Down

0 comments on commit 709540c

Please sign in to comment.