Unset CV before calling zval_ptr_dtor(), because its destructor may bailout and stay CV value in inconsistet state

This commit is contained in:
Dmitry Stogov 2014-04-09 10:47:24 +04:00
parent c99b767537
commit abbb1c0f00
2 changed files with 26 additions and 13 deletions

View File

@ -4007,8 +4007,9 @@ ZEND_VM_HANDLER(74, ZEND_UNSET_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR)
if (OP1_TYPE == IS_CV &&
OP2_TYPE == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
zval_ptr_dtor(EX_VAR(opline->op1.var));
ZVAL_COPY_VALUE(&tmp, EX_VAR(opline->op1.var));
ZVAL_UNDEF(EX_VAR(opline->op1.var));
zval_ptr_dtor(&tmp);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}

View File

@ -4021,8 +4021,9 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HA
if (IS_CONST == IS_CV &&
IS_CONST == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
zval_ptr_dtor(EX_VAR(opline->op1.var));
ZVAL_COPY_VALUE(&tmp, EX_VAR(opline->op1.var));
ZVAL_UNDEF(EX_VAR(opline->op1.var));
zval_ptr_dtor(&tmp);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@ -5657,8 +5658,9 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HAND
if (IS_CONST == IS_CV &&
IS_VAR == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
zval_ptr_dtor(EX_VAR(opline->op1.var));
ZVAL_COPY_VALUE(&tmp, EX_VAR(opline->op1.var));
ZVAL_UNDEF(EX_VAR(opline->op1.var));
zval_ptr_dtor(&tmp);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@ -6296,8 +6298,9 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_H
if (IS_CONST == IS_CV &&
IS_UNUSED == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
zval_ptr_dtor(EX_VAR(opline->op1.var));
ZVAL_COPY_VALUE(&tmp, EX_VAR(opline->op1.var));
ZVAL_UNDEF(EX_VAR(opline->op1.var));
zval_ptr_dtor(&tmp);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@ -8952,8 +8955,9 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HAND
if (IS_TMP_VAR == IS_CV &&
IS_CONST == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
zval_ptr_dtor(EX_VAR(opline->op1.var));
ZVAL_COPY_VALUE(&tmp, EX_VAR(opline->op1.var));
ZVAL_UNDEF(EX_VAR(opline->op1.var));
zval_ptr_dtor(&tmp);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@ -10552,8 +10556,9 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLE
if (IS_TMP_VAR == IS_CV &&
IS_VAR == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
zval_ptr_dtor(EX_VAR(opline->op1.var));
ZVAL_COPY_VALUE(&tmp, EX_VAR(opline->op1.var));
ZVAL_UNDEF(EX_VAR(opline->op1.var));
zval_ptr_dtor(&tmp);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@ -11077,8 +11082,9 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HAN
if (IS_TMP_VAR == IS_CV &&
IS_UNUSED == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
zval_ptr_dtor(EX_VAR(opline->op1.var));
ZVAL_COPY_VALUE(&tmp, EX_VAR(opline->op1.var));
ZVAL_UNDEF(EX_VAR(opline->op1.var));
zval_ptr_dtor(&tmp);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@ -15271,8 +15277,9 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAND
if (IS_VAR == IS_CV &&
IS_CONST == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
zval_ptr_dtor(EX_VAR(opline->op1.var));
ZVAL_COPY_VALUE(&tmp, EX_VAR(opline->op1.var));
ZVAL_UNDEF(EX_VAR(opline->op1.var));
zval_ptr_dtor(&tmp);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@ -19695,8 +19702,9 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLE
if (IS_VAR == IS_CV &&
IS_VAR == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
zval_ptr_dtor(EX_VAR(opline->op1.var));
ZVAL_COPY_VALUE(&tmp, EX_VAR(opline->op1.var));
ZVAL_UNDEF(EX_VAR(opline->op1.var));
zval_ptr_dtor(&tmp);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@ -21117,8 +21125,9 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HAN
if (IS_VAR == IS_CV &&
IS_UNUSED == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
zval_ptr_dtor(EX_VAR(opline->op1.var));
ZVAL_COPY_VALUE(&tmp, EX_VAR(opline->op1.var));
ZVAL_UNDEF(EX_VAR(opline->op1.var));
zval_ptr_dtor(&tmp);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@ -32434,8 +32443,9 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDL
if (IS_CV == IS_CV &&
IS_CONST == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
zval_ptr_dtor(EX_VAR(opline->op1.var));
ZVAL_COPY_VALUE(&tmp, EX_VAR(opline->op1.var));
ZVAL_UNDEF(EX_VAR(opline->op1.var));
zval_ptr_dtor(&tmp);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@ -36615,8 +36625,9 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER
if (IS_CV == IS_CV &&
IS_VAR == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
zval_ptr_dtor(EX_VAR(opline->op1.var));
ZVAL_COPY_VALUE(&tmp, EX_VAR(opline->op1.var));
ZVAL_UNDEF(EX_VAR(opline->op1.var));
zval_ptr_dtor(&tmp);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@ -37919,8 +37930,9 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HAND
if (IS_CV == IS_CV &&
IS_UNUSED == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
zval_ptr_dtor(EX_VAR(opline->op1.var));
ZVAL_COPY_VALUE(&tmp, EX_VAR(opline->op1.var));
ZVAL_UNDEF(EX_VAR(opline->op1.var));
zval_ptr_dtor(&tmp);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}