Skip to content

Commit 66d5b06

Browse files
committed
Merge branch 'PHP-7.3' into PHP-7.4
* PHP-7.3: Fixed bug #78999 (Cycle leak when using function result as temporary)
2 parents 7e05f97 + eb84693 commit 66d5b06

File tree

4 files changed

+55
-0
lines changed

4 files changed

+55
-0
lines changed

NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ PHP NEWS
1010
never saved). (Nikita)
1111
. Fixed bug #78776 (Abstract method implementation from trait does not check
1212
"static"). (Nikita)
13+
. Fixed bug #78999 (Cycle leak when using function result as temporary).
14+
(Dmitry)
1315

1416
- OPcache:
1517
. Fixed bug #78961 (erroneous optimization of re-assigned $GLOBALS). (Dmitry)

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
@@ -4328,7 +4328,11 @@ ZEND_VM_INLINE_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY)
43284328
if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
43294329
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
43304330
if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
4331+
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
43314332
ZVAL_COPY_VALUE(return_value, retval_ptr);
4333+
if (GC_MAY_LEAK(ref)) {
4334+
gc_possible_root(ref);
4335+
}
43324336
ZVAL_NULL(retval_ptr);
43334337
break;
43344338
} else {

Zend/zend_vm_execute.h

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3523,7 +3523,11 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CONST_
35233523
if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
35243524
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
35253525
if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
3526+
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
35263527
ZVAL_COPY_VALUE(return_value, retval_ptr);
3528+
if (GC_MAY_LEAK(ref)) {
3529+
gc_possible_root(ref);
3530+
}
35273531
ZVAL_NULL(retval_ptr);
35283532
break;
35293533
} else {
@@ -17798,7 +17802,11 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_TMP_HA
1779817802
if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
1779917803
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
1780017804
if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
17805+
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
1780117806
ZVAL_COPY_VALUE(return_value, retval_ptr);
17807+
if (GC_MAY_LEAK(ref)) {
17808+
gc_possible_root(ref);
17809+
}
1780217810
ZVAL_NULL(retval_ptr);
1780317811
break;
1780417812
} else {
@@ -20634,7 +20642,11 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_VAR_HA
2063420642
if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
2063520643
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
2063620644
if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
20645+
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
2063720646
ZVAL_COPY_VALUE(return_value, retval_ptr);
20647+
if (GC_MAY_LEAK(ref)) {
20648+
gc_possible_root(ref);
20649+
}
2063820650
ZVAL_NULL(retval_ptr);
2063920651
break;
2064020652
} else {
@@ -37001,7 +37013,11 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CV_HAN
3700137013
if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
3700237014
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
3700337015
if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
37016+
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
3700437017
ZVAL_COPY_VALUE(return_value, retval_ptr);
37018+
if (GC_MAY_LEAK(ref)) {
37019+
gc_possible_root(ref);
37020+
}
3700537021
ZVAL_NULL(retval_ptr);
3700637022
break;
3700737023
} else {
@@ -53788,7 +53804,11 @@ ZEND_API void execute_ex(zend_execute_data *ex)
5378853804
if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
5378953805
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
5379053806
if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
53807+
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
5379153808
ZVAL_COPY_VALUE(return_value, retval_ptr);
53809+
if (GC_MAY_LEAK(ref)) {
53810+
gc_possible_root(ref);
53811+
}
5379253812
ZVAL_NULL(retval_ptr);
5379353813
break;
5379453814
} else {
@@ -55262,7 +55282,11 @@ ZEND_API void execute_ex(zend_execute_data *ex)
5526255282
if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
5526355283
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
5526455284
if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
55285+
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
5526555286
ZVAL_COPY_VALUE(return_value, retval_ptr);
55287+
if (GC_MAY_LEAK(ref)) {
55288+
gc_possible_root(ref);
55289+
}
5526655290
ZVAL_NULL(retval_ptr);
5526755291
break;
5526855292
} else {
@@ -55548,7 +55572,11 @@ ZEND_API void execute_ex(zend_execute_data *ex)
5554855572
if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
5554955573
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
5555055574
if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
55575+
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
5555155576
ZVAL_COPY_VALUE(return_value, retval_ptr);
55577+
if (GC_MAY_LEAK(ref)) {
55578+
gc_possible_root(ref);
55579+
}
5555255580
ZVAL_NULL(retval_ptr);
5555355581
break;
5555455582
} else {
@@ -56630,7 +56658,11 @@ ZEND_API void execute_ex(zend_execute_data *ex)
5663056658
if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
5663156659
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
5663256660
if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
56661+
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
5663356662
ZVAL_COPY_VALUE(return_value, retval_ptr);
56663+
if (GC_MAY_LEAK(ref)) {
56664+
gc_possible_root(ref);
56665+
}
5663456666
ZVAL_NULL(retval_ptr);
5663556667
break;
5663656668
} else {

0 commit comments

Comments
 (0)