diff options
author | twosee <twose@qq.com> | 2020-07-11 06:15:28 +0800 |
---|---|---|
committer | twosee <twose@qq.com> | 2020-07-11 06:15:28 +0800 |
commit | 8db2ae8ffbd3bfe745c1a49c4d7c5691786cb9c8 (patch) | |
tree | 5306b078062c9f2e318b0f74d36bc13ec6d655ef | |
parent | 3f8d71d37f9448eace33b82cf7a838a6f637ab19 (diff) | |
parent | 150504e6b1ea2b2eac3177c8cff2657a243da22c (diff) | |
download | php-git-8db2ae8ffbd3bfe745c1a49c4d7c5691786cb9c8.tar.gz |
Merge branch 'PHP-7.3' into PHP-7.4
* PHP-7.3:
Fixed bug #79821
-rw-r--r-- | ext/standard/tests/bug79821.phpt | 21 | ||||
-rw-r--r-- | ext/standard/var.c | 3 |
2 files changed, 24 insertions, 0 deletions
diff --git a/ext/standard/tests/bug79821.phpt b/ext/standard/tests/bug79821.phpt new file mode 100644 index 0000000000..cf1d27e128 --- /dev/null +++ b/ext/standard/tests/bug79821.phpt @@ -0,0 +1,21 @@ +--TEST-- +Bug #79821 (array grow during var_dump) +--FILE-- +<?php + +$foo = $bar = []; +for ($i = 0; $i < 3; $i++) { + $foo = [$foo, [&$bar]]; +} +ob_start(function (string $buffer) use (&$bar) { + $bar[][] = null; + return ''; +}, 1); +var_dump($foo[0]); +ob_end_clean(); + +echo "OK\n"; + +?> +--EXPECT-- +OK diff --git a/ext/standard/var.c b/ext/standard/var.c index 6e59eab419..460674a8ed 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -132,6 +132,7 @@ again: PUTS("*RECURSION*\n"); return; } + GC_ADDREF(myht); GC_PROTECT_RECURSION(myht); } count = zend_array_count(myht); @@ -538,8 +539,10 @@ again: ZEND_HASH_FOREACH_KEY_VAL_IND(myht, index, key, val) { php_array_element_export(val, index, key, level, buf); } ZEND_HASH_FOREACH_END(); + if (!(GC_FLAGS(myht) & GC_IMMUTABLE)) { GC_UNPROTECT_RECURSION(myht); + GC_DELREF(myht); } if (level > 1) { buffer_append_spaces(buf, level - 1); |