Skip to content

Commit b529d02

Browse files
committed
Allow observer handlers disabling optimization in RETURN opcode handler, that may cause loss value of returned local variable.
1 parent 094e1a8 commit b529d02

File tree

3 files changed

+14
-11
lines changed

3 files changed

+14
-11
lines changed

Zend/zend_compile.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,9 @@ struct _zend_execute_data {
531531
#define ZEND_CALL_DYNAMIC (1 << 25)
532532
#define ZEND_CALL_MAY_HAVE_UNDEF (1 << 26)
533533
#define ZEND_CALL_HAS_EXTRA_NAMED_PARAMS (1 << 27)
534+
#define ZEND_CALL_OBSERVED (1 << 28) /* "fcall_begin" observer handler may set this flag */
535+
/* to prevent optimization in RETURN handler and */
536+
/* keep all local variables for "fcall_end" handler */
534537
#define ZEND_CALL_SEND_ARG_BY_REF (1u << 31)
535538

536539
#define ZEND_CALL_NESTED_FUNCTION (ZEND_CALL_FUNCTION | ZEND_CALL_NESTED)

Zend/zend_vm_def.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4269,7 +4269,7 @@ ZEND_VM_INLINE_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY, SPEC(OBSERVER))
42694269
do {
42704270
if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
42714271
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
4272-
if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
4272+
if (EXPECTED(!(EX_CALL_INFO() & (ZEND_CALL_CODE|ZEND_CALL_OBSERVED)))) {
42734273
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
42744274
ZVAL_COPY_VALUE(return_value, retval_ptr);
42754275
if (GC_MAY_LEAK(ref)) {

Zend/zend_vm_execute.h

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4047,7 +4047,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CONST_
40474047
do {
40484048
if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
40494049
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
4050-
if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
4050+
if (EXPECTED(!(EX_CALL_INFO() & (ZEND_CALL_CODE|ZEND_CALL_OBSERVED)))) {
40514051
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
40524052
ZVAL_COPY_VALUE(return_value, retval_ptr);
40534053
if (GC_MAY_LEAK(ref)) {
@@ -4124,7 +4124,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_OBSER
41244124
do {
41254125
if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
41264126
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
4127-
if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
4127+
if (EXPECTED(!(EX_CALL_INFO() & (ZEND_CALL_CODE|ZEND_CALL_OBSERVED)))) {
41284128
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
41294129
ZVAL_COPY_VALUE(return_value, retval_ptr);
41304130
if (GC_MAY_LEAK(ref)) {
@@ -18568,7 +18568,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_TMP_HA
1856818568
do {
1856918569
if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
1857018570
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
18571-
if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
18571+
if (EXPECTED(!(EX_CALL_INFO() & (ZEND_CALL_CODE|ZEND_CALL_OBSERVED)))) {
1857218572
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
1857318573
ZVAL_COPY_VALUE(return_value, retval_ptr);
1857418574
if (GC_MAY_LEAK(ref)) {
@@ -21140,7 +21140,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_VAR_HA
2114021140
do {
2114121141
if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
2114221142
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
21143-
if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
21143+
if (EXPECTED(!(EX_CALL_INFO() & (ZEND_CALL_CODE|ZEND_CALL_OBSERVED)))) {
2114421144
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
2114521145
ZVAL_COPY_VALUE(return_value, retval_ptr);
2114621146
if (GC_MAY_LEAK(ref)) {
@@ -37678,7 +37678,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CV_HAN
3767837678
do {
3767937679
if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
3768037680
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
37681-
if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
37681+
if (EXPECTED(!(EX_CALL_INFO() & (ZEND_CALL_CODE|ZEND_CALL_OBSERVED)))) {
3768237682
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
3768337683
ZVAL_COPY_VALUE(return_value, retval_ptr);
3768437684
if (GC_MAY_LEAK(ref)) {
@@ -54770,7 +54770,7 @@ ZEND_API void execute_ex(zend_execute_data *ex)
5477054770
do {
5477154771
if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
5477254772
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
54773-
if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
54773+
if (EXPECTED(!(EX_CALL_INFO() & (ZEND_CALL_CODE|ZEND_CALL_OBSERVED)))) {
5477454774
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
5477554775
ZVAL_COPY_VALUE(return_value, retval_ptr);
5477654776
if (GC_MAY_LEAK(ref)) {
@@ -54848,7 +54848,7 @@ ZEND_API void execute_ex(zend_execute_data *ex)
5484854848
do {
5484954849
if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
5485054850
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
54851-
if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
54851+
if (EXPECTED(!(EX_CALL_INFO() & (ZEND_CALL_CODE|ZEND_CALL_OBSERVED)))) {
5485254852
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
5485354853
ZVAL_COPY_VALUE(return_value, retval_ptr);
5485454854
if (GC_MAY_LEAK(ref)) {
@@ -56385,7 +56385,7 @@ ZEND_API void execute_ex(zend_execute_data *ex)
5638556385
do {
5638656386
if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
5638756387
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
56388-
if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
56388+
if (EXPECTED(!(EX_CALL_INFO() & (ZEND_CALL_CODE|ZEND_CALL_OBSERVED)))) {
5638956389
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
5639056390
ZVAL_COPY_VALUE(return_value, retval_ptr);
5639156391
if (GC_MAY_LEAK(ref)) {
@@ -56686,7 +56686,7 @@ ZEND_API void execute_ex(zend_execute_data *ex)
5668656686
do {
5668756687
if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
5668856688
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
56689-
if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
56689+
if (EXPECTED(!(EX_CALL_INFO() & (ZEND_CALL_CODE|ZEND_CALL_OBSERVED)))) {
5669056690
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
5669156691
ZVAL_COPY_VALUE(return_value, retval_ptr);
5669256692
if (GC_MAY_LEAK(ref)) {
@@ -57803,7 +57803,7 @@ ZEND_API void execute_ex(zend_execute_data *ex)
5780357803
do {
5780457804
if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
5780557805
if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
57806-
if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
57806+
if (EXPECTED(!(EX_CALL_INFO() & (ZEND_CALL_CODE|ZEND_CALL_OBSERVED)))) {
5780757807
zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
5780857808
ZVAL_COPY_VALUE(return_value, retval_ptr);
5780957809
if (GC_MAY_LEAK(ref)) {

0 commit comments

Comments
 (0)