Skip to content

Commit eb84693

Browse files
committed
Fixed bug #78999 (Cycle leak when using function result as temporary)
1 parent 3e35b08 commit eb84693

File tree

4 files changed

+57
-0
lines changed

4 files changed

+57
-0
lines changed

NEWS

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ PHP NEWS
22
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
33
?? ??? ????, PHP 7.3.14
44

5+
- Core
6+
. Fixed bug #78999 (Cycle leak when using function result as temporary).
7+
(Dmitry)
8+
59
- CURL:
610
. Implemented FR #77711 (CURLFile should support UNICODE filenames). (cmb)
711

Zend/tests/bug78999.phpt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
--TEST--
2+
Bug #78999 (Cycle leak when using function result as temporary)
3+
--FILE--
4+
<?php
5+
function get() {
6+
$t = new stdClass;
7+
$t->prop = $t;
8+
return $t;
9+
}
10+
var_dump(get());
11+
var_dump(gc_collect_cycles());
12+
--EXPECT--
13+
object(stdClass)#1 (1) {
14+
["prop"]=>
15+
*RECURSION*
16+
}
17+
int(1)

Zend/zend_vm_def.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3860,6 +3860,10 @@ ZEND_VM_HOT_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY)
38603860
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
38613861
ZVAL_COPY_VALUE(return_value, retval_ptr);
38623862
if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
3863+
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
3864+
if (GC_MAY_LEAK(ref)) {
3865+
gc_possible_root(ref);
3866+
}
38633867
ZVAL_NULL(retval_ptr);
38643868
} else {
38653869
Z_ADDREF_P(return_value);

Zend/zend_vm_execute.h

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2727,6 +2727,10 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CONST_
27272727
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
27282728
ZVAL_COPY_VALUE(return_value, retval_ptr);
27292729
if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
2730+
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
2731+
if (GC_MAY_LEAK(ref)) {
2732+
gc_possible_root(ref);
2733+
}
27302734
ZVAL_NULL(retval_ptr);
27312735
} else {
27322736
Z_ADDREF_P(return_value);
@@ -17665,6 +17669,10 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_TMP_HA
1766517669
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
1766617670
ZVAL_COPY_VALUE(return_value, retval_ptr);
1766717671
if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
17672+
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
17673+
if (GC_MAY_LEAK(ref)) {
17674+
gc_possible_root(ref);
17675+
}
1766817676
ZVAL_NULL(retval_ptr);
1766917677
} else {
1767017678
Z_ADDREF_P(return_value);
@@ -20433,6 +20441,10 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_VAR_HA
2043320441
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
2043420442
ZVAL_COPY_VALUE(return_value, retval_ptr);
2043520443
if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
20444+
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
20445+
if (GC_MAY_LEAK(ref)) {
20446+
gc_possible_root(ref);
20447+
}
2043620448
ZVAL_NULL(retval_ptr);
2043720449
} else {
2043820450
Z_ADDREF_P(return_value);
@@ -36875,6 +36887,10 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CV_HAN
3687536887
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
3687636888
ZVAL_COPY_VALUE(return_value, retval_ptr);
3687736889
if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
36890+
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
36891+
if (GC_MAY_LEAK(ref)) {
36892+
gc_possible_root(ref);
36893+
}
3687836894
ZVAL_NULL(retval_ptr);
3687936895
} else {
3688036896
Z_ADDREF_P(return_value);
@@ -55714,6 +55730,10 @@ ZEND_API void execute_ex(zend_execute_data *ex)
5571455730
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
5571555731
ZVAL_COPY_VALUE(return_value, retval_ptr);
5571655732
if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
55733+
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
55734+
if (GC_MAY_LEAK(ref)) {
55735+
gc_possible_root(ref);
55736+
}
5571755737
ZVAL_NULL(retval_ptr);
5571855738
} else {
5571955739
Z_ADDREF_P(return_value);
@@ -57328,6 +57348,10 @@ ZEND_API void execute_ex(zend_execute_data *ex)
5732857348
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
5732957349
ZVAL_COPY_VALUE(return_value, retval_ptr);
5733057350
if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
57351+
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
57352+
if (GC_MAY_LEAK(ref)) {
57353+
gc_possible_root(ref);
57354+
}
5733157355
ZVAL_NULL(retval_ptr);
5733257356
} else {
5733357357
Z_ADDREF_P(return_value);
@@ -57614,6 +57638,10 @@ ZEND_API void execute_ex(zend_execute_data *ex)
5761457638
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
5761557639
ZVAL_COPY_VALUE(return_value, retval_ptr);
5761657640
if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
57641+
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
57642+
if (GC_MAY_LEAK(ref)) {
57643+
gc_possible_root(ref);
57644+
}
5761757645
ZVAL_NULL(retval_ptr);
5761857646
} else {
5761957647
Z_ADDREF_P(return_value);
@@ -59256,6 +59284,10 @@ ZEND_API void execute_ex(zend_execute_data *ex)
5925659284
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
5925759285
ZVAL_COPY_VALUE(return_value, retval_ptr);
5925859286
if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
59287+
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
59288+
if (GC_MAY_LEAK(ref)) {
59289+
gc_possible_root(ref);
59290+
}
5925959291
ZVAL_NULL(retval_ptr);
5926059292
} else {
5926159293
Z_ADDREF_P(return_value);

0 commit comments

Comments
 (0)