]> granicus.if.org Git - php/commitdiff
Fix leak if get_iterator throws but doesn't return NULL
authorNikita Popov <nikic@php.net>
Thu, 14 Jul 2016 20:29:04 +0000 (22:29 +0200)
committerNikita Popov <nikic@php.net>
Sat, 16 Jul 2016 21:16:34 +0000 (23:16 +0200)
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 0be1b5726c10507312a802c289b7cb290a68219d..161a3f53facca4112c06d2ccf4149af6d2f2dfcd 100644 (file)
@@ -5754,6 +5754,9 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET_R, CONST|TMP|VAR|CV, JMP_ADDR)
 
                        if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) {
                                FREE_OP1();
+                               if (iter) {
+                                       OBJ_RELEASE(&iter->std);
+                               }
                                if (!EG(exception)) {
                                        zend_throw_exception_ex(NULL, 0, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name));
                                }
index 5943e4b5c75630af9f94310aac5d0aa2122a0e37..3df5217514c462184bdc3b5ec551d6ba43585ddf 100644 (file)
@@ -3511,6 +3511,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_CONST_HANDLER(
 
                        if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) {
 
+                               if (iter) {
+                                       OBJ_RELEASE(&iter->std);
+                               }
                                if (!EG(exception)) {
                                        zend_throw_exception_ex(NULL, 0, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name));
                                }
@@ -12571,6 +12574,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_TMP_HANDLER(ZE
 
                        if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) {
                                zval_ptr_dtor_nogc(free_op1);
+                               if (iter) {
+                                       OBJ_RELEASE(&iter->std);
+                               }
                                if (!EG(exception)) {
                                        zend_throw_exception_ex(NULL, 0, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name));
                                }
@@ -16157,6 +16163,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_VAR_HANDLER(ZE
 
                        if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) {
                                zval_ptr_dtor_nogc(free_op1);
+                               if (iter) {
+                                       OBJ_RELEASE(&iter->std);
+                               }
                                if (!EG(exception)) {
                                        zend_throw_exception_ex(NULL, 0, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name));
                                }
@@ -35267,6 +35276,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_CV_HANDLER(ZEN
 
                        if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) {
 
+                               if (iter) {
+                                       OBJ_RELEASE(&iter->std);
+                               }
                                if (!EG(exception)) {
                                        zend_throw_exception_ex(NULL, 0, "Object of type %s did not create an Iterator", ZSTR_VAL(ce->name));
                                }