mirror of
https://github.com/php/php-src.git
synced 2026-10-28 17:56:50 +08:00
The getHash() recursion guard increments a request-persistent counter around the userland getHash() call but decrements it only on the normal return path. A bailout inside an overridden getHash() (out-of-memory, timeout, or any fatal) skips the decrement, and the counter is never reset per request, so on a persistent SAPI every later request on the same worker wrongly throws "Modification of SplObjectStorage during getHash() is prohibited". Reset the counter in the SPL request init so each request starts at zero regardless of how the previous one exited. Closes GH-22308
37 lines
1.3 KiB
C
37 lines
1.3 KiB
C
/*
|
|
+----------------------------------------------------------------------+
|
|
| Copyright © The PHP Group and Contributors. |
|
|
+----------------------------------------------------------------------+
|
|
| This source file is subject to the Modified BSD License that is |
|
|
| bundled with this package in the file LICENSE, and is available |
|
|
| through the World Wide Web at <https://www.php.net/license/>. |
|
|
| |
|
|
| SPDX-License-Identifier: BSD-3-Clause |
|
|
+----------------------------------------------------------------------+
|
|
| Authors: Marcus Boerger <helly@php.net> |
|
|
+----------------------------------------------------------------------+
|
|
*/
|
|
|
|
#ifndef SPL_OBSERVER_H
|
|
#define SPL_OBSERVER_H
|
|
|
|
#include "php.h"
|
|
|
|
typedef enum {
|
|
MIT_NEED_ANY = 0,
|
|
MIT_NEED_ALL = 1,
|
|
MIT_KEYS_NUMERIC = 0,
|
|
MIT_KEYS_ASSOC = 2
|
|
} MultipleIteratorFlags;
|
|
|
|
extern PHPAPI zend_class_entry *spl_ce_SplObserver;
|
|
extern PHPAPI zend_class_entry *spl_ce_SplSubject;
|
|
extern PHPAPI zend_class_entry *spl_ce_SplObjectStorage;
|
|
extern PHPAPI zend_class_entry *spl_ce_MultipleIterator;
|
|
|
|
PHP_MINIT_FUNCTION(spl_observer);
|
|
|
|
void spl_object_storage_reset_get_hash_depth(void);
|
|
|
|
#endif /* SPL_OBSERVER_H */
|