From e081db0410d1dc82f601d9fd875da80de8eca43e Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 12 Jul 2021 12:24:59 +0200 Subject: [PATCH] Don't return embedded HT from WeakMap get_gc() handler This HT is embedded in the WeakMap and as such musn't be freed by GC (or otherwise participate in GC). Instead add the values contained in it to the GC buffer. --- Zend/zend_weakrefs.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Zend/zend_weakrefs.c b/Zend/zend_weakrefs.c index 41c873c4395..521954d0b76 100644 --- a/Zend/zend_weakrefs.c +++ b/Zend/zend_weakrefs.c @@ -420,9 +420,13 @@ static HashTable *zend_weakmap_get_properties_for(zend_object *object, zend_prop static HashTable *zend_weakmap_get_gc(zend_object *object, zval **table, int *n) { zend_weakmap *wm = zend_weakmap_from(object); - *table = NULL; - *n = 0; - return &wm->ht; + zend_get_gc_buffer *gc_buffer = zend_get_gc_buffer_create(); + zval *val; + ZEND_HASH_FOREACH_VAL(&wm->ht, val) { + zend_get_gc_buffer_add_zval(gc_buffer, val); + } ZEND_HASH_FOREACH_END(); + zend_get_gc_buffer_use(gc_buffer, table, n); + return NULL; } static zend_object *zend_weakmap_clone_obj(zend_object *old_object)