diff --git a/Zend/tests/gh16371.phpt b/Zend/tests/gh16371.phpt new file mode 100644 index 0000000000000..568bb8faf12f9 --- /dev/null +++ b/Zend/tests/gh16371.phpt @@ -0,0 +1,47 @@ +--TEST-- +GH-16371: Assertion failure in zend_weakmap_iterator_get_current_key() for invalid iterator +--FILE-- +getIterator(); + +print "# Empty WeakMap\n"; + +var_dump($it->key()); +var_dump($it->current()); +var_dump($it->valid()); + +$map = new WeakMap(); +$obj = new stdClass; +$map[$obj] = 0; + +print "# Valid iterator\n"; + +$it = $map->getIterator(); +var_dump($it->key()); +var_dump($it->current()); +var_dump($it->valid()); + +print "# End of iterator\n"; + +$it->next(); +var_dump($it->key()); +var_dump($it->current()); +var_dump($it->valid()); + +?> +--EXPECTF-- +# Empty WeakMap +NULL +NULL +bool(false) +# Valid iterator +object(stdClass)#%d (0) { +} +int(0) +bool(true) +# End of iterator +NULL +NULL +bool(false) diff --git a/Zend/zend_weakrefs.c b/Zend/zend_weakrefs.c index 3f2e517f3fe4e..bd25b5b839190 100644 --- a/Zend/zend_weakrefs.c +++ b/Zend/zend_weakrefs.c @@ -530,6 +530,10 @@ static void zend_weakmap_iterator_get_current_key(zend_object_iterator *obj_iter zend_string *string_key; zend_ulong num_key; int key_type = zend_hash_get_current_key_ex(&wm->ht, &string_key, &num_key, pos); + if (key_type == HASH_KEY_NON_EXISTENT) { + ZVAL_NULL(key); + return; + } if (key_type != HASH_KEY_IS_LONG) { ZEND_ASSERT(0 && "Must have integer key"); }