From: Dmitry Stogov Date: Wed, 9 Apr 2014 06:47:24 +0000 (+0400) Subject: Unset CV before calling zval_ptr_dtor(), because its destructor may bailout and stay... X-Git-Tag: POST_PHPNG_MERGE~412^2~151 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=abbb1c0f0077bb092c9ec10d783b46c87357235a;p=php Unset CV before calling zval_ptr_dtor(), because its destructor may bailout and stay CV value in inconsistet state --- diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index f8d79a6b53..2d0d18045b 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -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(); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 6fd32c049b..bcbbd9c9c9 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -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(); }