From: Marcus Boerger Date: Mon, 24 Jan 2005 20:02:55 +0000 (+0000) Subject: - Second and last part of #30725 fix X-Git-Tag: RELEASE_0_2~172 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3cf4eae4aa005e7978410a35336608bafcaed3cc;p=php - Second and last part of #30725 fix --- diff --git a/Zend/tests/bug30725.phpt b/Zend/tests/bug30725.phpt index 511ab815f3..ce6c9a50a2 100755 --- a/Zend/tests/bug30725.phpt +++ b/Zend/tests/bug30725.phpt @@ -27,6 +27,6 @@ catch(Exception $e) ?> ===DONE=== ----EXPECT--- +--EXPECT-- Caught ===DONE=== diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 304b4e6740..7a23a5cbb3 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2863,10 +2863,13 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET, CONST|TMP|VAR|CV, ANY) if (ce && ce->get_iterator) { iter = ce->get_iterator(ce, array_ptr TSRMLS_CC); - if (iter) { + if (iter && !EG(exception)) { array_ptr = zend_iterator_wrap(iter TSRMLS_CC); } else { - array_ptr->refcount++; + zval_ptr_dtor(&array_ptr); + if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + zend_throw_exception_internal(NULL TSRMLS_CC); + ZEND_VM_NEXT_OPCODE(); } } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index ebb49e13d6..6f1cdc7cb1 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -1959,10 +1959,13 @@ static int ZEND_FE_RESET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) if (ce && ce->get_iterator) { iter = ce->get_iterator(ce, array_ptr TSRMLS_CC); - if (iter) { + if (iter && !EG(exception)) { array_ptr = zend_iterator_wrap(iter TSRMLS_CC); } else { - array_ptr->refcount++; + zval_ptr_dtor(&array_ptr); + if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + zend_throw_exception_internal(NULL TSRMLS_CC); + ZEND_VM_NEXT_OPCODE(); } } @@ -4368,10 +4371,13 @@ static int ZEND_FE_RESET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) if (ce && ce->get_iterator) { iter = ce->get_iterator(ce, array_ptr TSRMLS_CC); - if (iter) { + if (iter && !EG(exception)) { array_ptr = zend_iterator_wrap(iter TSRMLS_CC); } else { - array_ptr->refcount++; + zval_ptr_dtor(&array_ptr); + if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + zend_throw_exception_internal(NULL TSRMLS_CC); + ZEND_VM_NEXT_OPCODE(); } } @@ -7439,10 +7445,13 @@ static int ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) if (ce && ce->get_iterator) { iter = ce->get_iterator(ce, array_ptr TSRMLS_CC); - if (iter) { + if (iter && !EG(exception)) { array_ptr = zend_iterator_wrap(iter TSRMLS_CC); } else { - array_ptr->refcount++; + zval_ptr_dtor(&array_ptr); + if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + zend_throw_exception_internal(NULL TSRMLS_CC); + ZEND_VM_NEXT_OPCODE(); } } @@ -18208,10 +18217,13 @@ static int ZEND_FE_RESET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) if (ce && ce->get_iterator) { iter = ce->get_iterator(ce, array_ptr TSRMLS_CC); - if (iter) { + if (iter && !EG(exception)) { array_ptr = zend_iterator_wrap(iter TSRMLS_CC); } else { - array_ptr->refcount++; + zval_ptr_dtor(&array_ptr); + if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + zend_throw_exception_internal(NULL TSRMLS_CC); + ZEND_VM_NEXT_OPCODE(); } } @@ -30500,10 +30512,13 @@ static int ZEND_FE_RESET_HANDLER(ZEND_OPCODE_HANDLER_ARGS) if (ce && ce->get_iterator) { iter = ce->get_iterator(ce, array_ptr TSRMLS_CC); - if (iter) { + if (iter && !EG(exception)) { array_ptr = zend_iterator_wrap(iter TSRMLS_CC); } else { - array_ptr->refcount++; + zval_ptr_dtor(&array_ptr); + if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + zend_throw_exception_internal(NULL TSRMLS_CC); + ZEND_VM_NEXT_OPCODE(); } }