1
0
mirror of https://github.com/php/php-src.git synced 2026-03-24 00:02:20 +01:00

Merge branch 'PHP-8.4'

* PHP-8.4:
  Fix GH-19801: address leak when calling var_dump() with recursion in __debugInfo() (#19837)
This commit is contained in:
Alexandre Daubois
2025-09-16 15:11:26 +02:00
4 changed files with 66 additions and 2 deletions

2
NEWS
View File

@@ -34,6 +34,8 @@ PHP NEWS
- Standard:
. Passing strings which are not one byte long to ord() is now deprecated.
(Girgias)
. Fixed bug GH-19801 (leaks in var_dump() and debug_zval_dump()).
(alexandre-daubois)
- URI:
. Fixed bug GH-19780 (InvalidUrlException should check $errors argument).

View File

@@ -0,0 +1,32 @@
--TEST--
GH-19801 (debug_zval_dump() leak with __debugInfo() that modifies circular references)
--FILE--
<?php
$a = [
new class {
function __debugInfo() {
global $b;
$b->a = null;
gc_collect_cycles();
return [];
}
},
];
$b = new stdClass;
$b->a = &$a;
debug_zval_dump($b);
?>
--EXPECTF--
object(stdClass)#2 (1) refcount(%d){
["a"]=>
reference refcount(%d) {
array(1) packed refcount(%d){
[0]=>
object(class@anonymous)#1 (0) refcount(%d){
}
}
}
}

View File

@@ -0,0 +1,30 @@
--TEST--
GH-19801 (var_dump() memory leak with __debugInfo() that modifies circular references)
--FILE--
<?php
$a = [
new class {
function __debugInfo() {
global $b;
$b->a = null;
gc_collect_cycles();
return [];
}
},
];
$b = new stdClass;
$b->a = &$a;
var_dump($b);
?>
--EXPECTF--
object(stdClass)#2 (1) {
["a"]=>
&array(1) {
[0]=>
object(class@anonymous)#1 (0) {
}
}
}

View File

@@ -153,7 +153,7 @@ again:
} ZEND_HASH_FOREACH_END();
if (!(GC_FLAGS(myht) & GC_IMMUTABLE)) {
GC_UNPROTECT_RECURSION(myht);
GC_DELREF(myht);
GC_DTOR_NO_REF(myht);
}
if (level > 1) {
php_printf("%*c", level-1, ' ');
@@ -354,7 +354,7 @@ PHPAPI void php_debug_zval_dump(zval *struc, int level) /* {{{ */
} ZEND_HASH_FOREACH_END();
if (!(GC_FLAGS(myht) & GC_IMMUTABLE)) {
GC_UNPROTECT_RECURSION(myht);
GC_DELREF(myht);
GC_DTOR_NO_REF(myht);
}
if (level > 1) {
php_printf("%*c", level - 1, ' ');