mirror of
https://github.com/php/php-src.git
synced 2026-04-30 03:33:17 +02:00
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.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user