summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-08-26 17:50:46 +0200
committerNikita Popov <nikita.ppv@gmail.com>2019-08-26 17:52:37 +0200
commit461db524001fbcbd3344a08651f3a64c775967d6 (patch)
treee8cfa01ec058a2e60218991e12b267026a7fa1cc
parente4ecadcb626d00feb5df17d66a43cabc0b440560 (diff)
parent589542f50cbaf2bfc88aea79092df9db54f75ac6 (diff)
downloadphp-git-461db524001fbcbd3344a08651f3a64c775967d6.tar.gz
Merge branch 'PHP-7.2' into PHP-7.3
-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 b6510153f0..3a36a8cc0d 100644
--- a/Zend/zend_gc.c
+++ b/Zend/zend_gc.c
@@ -1400,6 +1400,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;
}