Skip to content

Commit 58d41b8

Browse files
SammyKnikic
authored andcommitted
Provide unused retvals to observers
Make sure that the return value is available to observers, even if it is not used by the caller. Closes GH-6422.
1 parent 9cfb526 commit 58d41b8

16 files changed

+555
-47
lines changed

Zend/zend_vm_def.h

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4239,9 +4239,11 @@ ZEND_VM_INLINE_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY, SPEC(OBSERVER))
42394239
USE_OPLINE
42404240
zval *retval_ptr;
42414241
zval *return_value;
4242+
ZEND_OBSERVER_USE_RETVAL;
42424243

42434244
retval_ptr = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
42444245
return_value = EX(return_value);
4246+
ZEND_OBSERVER_SET_RETVAL();
42454247
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) {
42464248
SAVE_OPLINE();
42474249
retval_ptr = ZVAL_UNDEFINED_OP1();
@@ -4305,32 +4307,37 @@ ZEND_VM_INLINE_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY, SPEC(OBSERVER))
43054307
}
43064308
ZEND_OBSERVER_SAVE_OPLINE();
43074309
ZEND_OBSERVER_FCALL_END(execute_data, return_value);
4310+
ZEND_OBSERVER_FREE_RETVAL();
43084311
ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
43094312
}
43104313

43114314
ZEND_VM_COLD_CONST_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY, SRC, SPEC(OBSERVER))
43124315
{
43134316
USE_OPLINE
43144317
zval *retval_ptr;
4318+
zval *return_value;
4319+
ZEND_OBSERVER_USE_RETVAL;
43154320

43164321
SAVE_OPLINE();
43174322

4323+
return_value = EX(return_value);
4324+
ZEND_OBSERVER_SET_RETVAL();
43184325
do {
43194326
if ((OP1_TYPE & (IS_CONST|IS_TMP_VAR)) ||
43204327
(OP1_TYPE == IS_VAR && opline->extended_value == ZEND_RETURNS_VALUE)) {
43214328
/* Not supposed to happen, but we'll allow it */
43224329
zend_error(E_NOTICE, "Only variable references should be returned by reference");
43234330

43244331
retval_ptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
4325-
if (!EX(return_value)) {
4332+
if (!return_value) {
43264333
FREE_OP1();
43274334
} else {
43284335
if (OP1_TYPE == IS_VAR && UNEXPECTED(Z_ISREF_P(retval_ptr))) {
4329-
ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
4336+
ZVAL_COPY_VALUE(return_value, retval_ptr);
43304337
break;
43314338
}
43324339

4333-
ZVAL_NEW_REF(EX(return_value), retval_ptr);
4340+
ZVAL_NEW_REF(return_value, retval_ptr);
43344341
if (OP1_TYPE == IS_CONST) {
43354342
Z_TRY_ADDREF_P(retval_ptr);
43364343
}
@@ -4344,28 +4351,29 @@ ZEND_VM_COLD_CONST_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY, SRC,
43444351
ZEND_ASSERT(retval_ptr != &EG(uninitialized_zval));
43454352
if (opline->extended_value == ZEND_RETURNS_FUNCTION && !Z_ISREF_P(retval_ptr)) {
43464353
zend_error(E_NOTICE, "Only variable references should be returned by reference");
4347-
if (EX(return_value)) {
4348-
ZVAL_NEW_REF(EX(return_value), retval_ptr);
4354+
if (return_value) {
4355+
ZVAL_NEW_REF(return_value, retval_ptr);
43494356
} else {
43504357
FREE_OP1_VAR_PTR();
43514358
}
43524359
break;
43534360
}
43544361
}
43554362

4356-
if (EX(return_value)) {
4363+
if (return_value) {
43574364
if (Z_ISREF_P(retval_ptr)) {
43584365
Z_ADDREF_P(retval_ptr);
43594366
} else {
43604367
ZVAL_MAKE_REF_EX(retval_ptr, 2);
43614368
}
4362-
ZVAL_REF(EX(return_value), Z_REF_P(retval_ptr));
4369+
ZVAL_REF(return_value, Z_REF_P(retval_ptr));
43634370
}
43644371

43654372
FREE_OP1_VAR_PTR();
43664373
} while (0);
43674374

4368-
ZEND_OBSERVER_FCALL_END(execute_data, EX(return_value));
4375+
ZEND_OBSERVER_FCALL_END(execute_data, return_value);
4376+
ZEND_OBSERVER_FREE_RETVAL();
43694377
ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
43704378
}
43714379

@@ -7710,7 +7718,7 @@ ZEND_VM_HELPER(zend_dispatch_try_catch_finally_helper, ANY, ANY, uint32_t try_ca
77107718

77117719
/* Uncaught exception */
77127720
if (zend_observer_fcall_op_array_extension != -1) {
7713-
zend_observer_fcall_end(execute_data, EX(return_value));
7721+
zend_observer_fcall_end(execute_data, NULL);
77147722
}
77157723
cleanup_live_vars(execute_data, op_num, 0);
77167724
if (UNEXPECTED((EX_CALL_INFO() & ZEND_CALL_GENERATOR) != 0)) {

0 commit comments

Comments
 (0)