Skip to content

Commit 6ef08b1

Browse files
committed
Merge branch 'PHP-7.3' into PHP-7.4
* PHP-7.3: Fixed bug #79830 introduced by fixing bug #79821
2 parents 8db2ae8 + 56dec3c commit 6ef08b1

File tree

2 files changed

+37
-25
lines changed

2 files changed

+37
-25
lines changed

ext/standard/tests/bug79821.phpt

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,18 @@ Bug #79821 (array grow during var_dump)
33
--FILE--
44
<?php
55

6-
$foo = $bar = [];
7-
for ($i = 0; $i < 3; $i++) {
8-
$foo = [$foo, [&$bar]];
6+
foreach (['var_dump', 'debug_zval_dump', 'var_export'] as $output) {
7+
$foo = $bar = [];
8+
for ($i = 0; $i < 3; $i++) {
9+
$foo = [$foo, [&$bar]];
10+
}
11+
ob_start(function (string $buffer) use (&$bar) {
12+
$bar[][] = null;
13+
return '';
14+
}, 64);
15+
$output($foo[0]);
16+
ob_end_clean();
917
}
10-
ob_start(function (string $buffer) use (&$bar) {
11-
$bar[][] = null;
12-
return '';
13-
}, 1);
14-
var_dump($foo[0]);
15-
ob_end_clean();
1618

1719
echo "OK\n";
1820

ext/standard/var.c

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -127,22 +127,26 @@ PHPAPI void php_var_dump(zval *struc, int level) /* {{{ */
127127
break;
128128
case IS_ARRAY:
129129
myht = Z_ARRVAL_P(struc);
130-
if (level > 1 && !(GC_FLAGS(myht) & GC_IMMUTABLE)) {
131-
if (GC_IS_RECURSIVE(myht)) {
132-
PUTS("*RECURSION*\n");
133-
return;
130+
if (!(GC_FLAGS(myht) & GC_IMMUTABLE)) {
131+
if (level > 1) {
132+
if (GC_IS_RECURSIVE(myht)) {
133+
PUTS("*RECURSION*\n");
134+
return;
135+
}
136+
GC_PROTECT_RECURSION(myht);
134137
}
135138
GC_ADDREF(myht);
136-
GC_PROTECT_RECURSION(myht);
137139
}
138140
count = zend_array_count(myht);
139141
php_printf("%sarray(%d) {\n", COMMON, count);
140-
141142
ZEND_HASH_FOREACH_KEY_VAL_IND(myht, num, key, val) {
142143
php_array_element_dump(val, num, key, level);
143144
} ZEND_HASH_FOREACH_END();
144-
if (level > 1 && !(GC_FLAGS(myht) & GC_IMMUTABLE)) {
145-
GC_UNPROTECT_RECURSION(myht);
145+
if (!(GC_FLAGS(myht) & GC_IMMUTABLE)) {
146+
if (level > 1) {
147+
GC_UNPROTECT_RECURSION(myht);
148+
}
149+
GC_DELREF(myht);
146150
}
147151
if (level > 1) {
148152
php_printf("%*c", level-1, ' ');
@@ -312,20 +316,26 @@ PHPAPI void php_debug_zval_dump(zval *struc, int level) /* {{{ */
312316
break;
313317
case IS_ARRAY:
314318
myht = Z_ARRVAL_P(struc);
315-
if (level > 1 && !(GC_FLAGS(myht) & GC_IMMUTABLE)) {
316-
if (GC_IS_RECURSIVE(myht)) {
317-
PUTS("*RECURSION*\n");
318-
return;
319+
if (!(GC_FLAGS(myht) & GC_IMMUTABLE)) {
320+
if (level > 1) {
321+
if (GC_IS_RECURSIVE(myht)) {
322+
PUTS("*RECURSION*\n");
323+
return;
324+
}
325+
GC_PROTECT_RECURSION(myht);
319326
}
320-
GC_PROTECT_RECURSION(myht);
327+
GC_ADDREF(myht);
321328
}
322329
count = zend_array_count(myht);
323330
php_printf("%sarray(%d) refcount(%u){\n", COMMON, count, Z_REFCOUNTED_P(struc) ? Z_REFCOUNT_P(struc) : 1);
324331
ZEND_HASH_FOREACH_KEY_VAL_IND(myht, index, key, val) {
325332
zval_array_element_dump(val, index, key, level);
326333
} ZEND_HASH_FOREACH_END();
327-
if (level > 1 && !(GC_FLAGS(myht) & GC_IMMUTABLE)) {
328-
GC_UNPROTECT_RECURSION(myht);
334+
if (!(GC_FLAGS(myht) & GC_IMMUTABLE)) {
335+
if (level > 1) {
336+
GC_UNPROTECT_RECURSION(myht);
337+
}
338+
GC_DELREF(myht);
329339
}
330340
if (level > 1) {
331341
php_printf("%*c", level - 1, ' ');
@@ -529,6 +539,7 @@ PHPAPI void php_var_export_ex(zval *struc, int level, smart_str *buf) /* {{{ */
529539
zend_error(E_WARNING, "var_export does not handle circular references");
530540
return;
531541
}
542+
GC_ADDREF(myht);
532543
GC_PROTECT_RECURSION(myht);
533544
}
534545
if (level > 1) {
@@ -539,7 +550,6 @@ PHPAPI void php_var_export_ex(zval *struc, int level, smart_str *buf) /* {{{ */
539550
ZEND_HASH_FOREACH_KEY_VAL_IND(myht, index, key, val) {
540551
php_array_element_export(val, index, key, level, buf);
541552
} ZEND_HASH_FOREACH_END();
542-
543553
if (!(GC_FLAGS(myht) & GC_IMMUTABLE)) {
544554
GC_UNPROTECT_RECURSION(myht);
545555
GC_DELREF(myht);

0 commit comments

Comments
 (0)