summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-08-26 17:52:56 +0200
committerNikita Popov <nikita.ppv@gmail.com>2019-08-26 17:52:56 +0200
commitfa8565a0f1d8276f478eb0bd495e535828ff124c (patch)
tree041ef34ead9af92a04a9bb0c1e6e83868cc3dc1d
parente2b49d6c45f0c5ed69268d32da2f4972265db663 (diff)
parent461db524001fbcbd3344a08651f3a64c775967d6 (diff)
downloadphp-git-fa8565a0f1d8276f478eb0bd495e535828ff124c.tar.gz
Merge branch 'PHP-7.3' into PHP-7.4
-rw-r--r--Zend/tests/gc_042.phpt28
-rw-r--r--Zend/zend_gc.c4
2 files changed, 32 insertions, 0 deletions
diff --git a/Zend/tests/gc_042.phpt b/Zend/tests/gc_042.phpt
new file mode 100644
index 0000000000..c8dfc0ef86
--- /dev/null
+++ b/Zend/tests/gc_042.phpt
@@ -0,0 +1,28 @@
+--TEST--
+Object properties HT may need to be removed from nested data
+--FILE--
+<?php
+
+class Test {
+ public function __destruct() {
+ $GLOBALS['x'] = $this;
+ }
+}
+
+$t = new Test;
+$t->x = new stdClass;
+$t->x->t = $t;
+$a = (array) $t->x;
+unset($t, $a);
+gc_collect_cycles();
+var_dump($x);
+
+?>
+--EXPECT--
+object(Test)#1 (1) {
+ ["x"]=>
+ object(stdClass)#2 (1) {
+ ["t"]=>
+ *RECURSION*
+ }
+}
diff --git a/Zend/zend_gc.c b/Zend/zend_gc.c
index 60e128ef19..b74a8e79b9 100644
--- a/Zend/zend_gc.c
+++ b/Zend/zend_gc.c
@@ -1379,6 +1379,10 @@ tail_call:
ref = Z_COUNTED_P(zv);
goto tail_call;
}
+ if (GC_REF_ADDRESS(ht) != 0 && GC_REF_CHECK_COLOR(ht, GC_BLACK)) {
+ GC_TRACE_REF(ht, "removing from buffer");
+ GC_REMOVE_FROM_BUFFER(ht);
+ }
} else {
return count;
}