Skip to content

Commit e081db0

Browse files
committed
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.
1 parent 5bde82a commit e081db0

File tree

1 file changed

+7
-3
lines changed

1 file changed

+7
-3
lines changed

Zend/zend_weakrefs.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -420,9 +420,13 @@ static HashTable *zend_weakmap_get_properties_for(zend_object *object, zend_prop
420420
static HashTable *zend_weakmap_get_gc(zend_object *object, zval **table, int *n)
421421
{
422422
zend_weakmap *wm = zend_weakmap_from(object);
423-
*table = NULL;
424-
*n = 0;
425-
return &wm->ht;
423+
zend_get_gc_buffer *gc_buffer = zend_get_gc_buffer_create();
424+
zval *val;
425+
ZEND_HASH_FOREACH_VAL(&wm->ht, val) {
426+
zend_get_gc_buffer_add_zval(gc_buffer, val);
427+
} ZEND_HASH_FOREACH_END();
428+
zend_get_gc_buffer_use(gc_buffer, table, n);
429+
return NULL;
426430
}
427431

428432
static zend_object *zend_weakmap_clone_obj(zend_object *old_object)

0 commit comments

Comments
 (0)