1
0
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:
Bob Weinand
2023-06-09 14:00:53 +02:00
parent 42619b2378
commit 709540ccdc
+2 -3
View File
@@ -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;
}