]> granicus.if.org Git - php/commitdiff
fix #37416 (iterator_to_array() hides exceptions thrown in rewind() method)
authorAntony Dovgal <tony2001@php.net>
Fri, 12 May 2006 09:42:19 +0000 (09:42 +0000)
committerAntony Dovgal <tony2001@php.net>
Fri, 12 May 2006 09:42:19 +0000 (09:42 +0000)
ext/spl/spl_iterators.c

index e8640df52e1f6fd955729f30eca5e33b74b57048..2389dd44128d67b239384f53bbee039dde994f99 100755 (executable)
@@ -2400,11 +2400,20 @@ PHP_FUNCTION(iterator_to_array)
        if (iter->funcs->rewind) {
                iter->funcs->rewind(iter TSRMLS_CC);
        }
+       if (EG(exception)) {
+               return;
+       }
        while (iter->funcs->valid(iter TSRMLS_CC) == SUCCESS) {
                iter->funcs->get_current_data(iter, &data TSRMLS_CC);
+               if (EG(exception)) {
+                       return;
+               }
                (*data)->refcount++;
                if (iter->funcs->get_current_key) {
                        key_type = iter->funcs->get_current_key(iter, &str_key, &str_key_len, &int_key TSRMLS_CC);
+                       if (EG(exception)) {
+                               return;
+                       }
                        switch(key_type) {
                                case HASH_KEY_IS_STRING:
                                        add_assoc_zval_ex(return_value, str_key.s, str_key_len, *data);
@@ -2422,8 +2431,14 @@ PHP_FUNCTION(iterator_to_array)
                        add_next_index_zval(return_value, *data);
                }
                iter->funcs->move_forward(iter TSRMLS_CC);
+               if (EG(exception)) {
+                       return;
+               }
        }
        iter->funcs->dtor(iter TSRMLS_CC);
+       if (EG(exception)) {
+               return;
+       }
 }
 /* }}} */
 
@@ -2444,11 +2459,23 @@ PHP_FUNCTION(iterator_count)
        if (iter->funcs->rewind) {
                iter->funcs->rewind(iter TSRMLS_CC);
        }
+       if (EG(exception)) {
+               return;
+       }
        while (iter->funcs->valid(iter TSRMLS_CC) == SUCCESS) {
+               if (EG(exception)) {
+                       return;
+               }
                count++;
                iter->funcs->move_forward(iter TSRMLS_CC);
+               if (EG(exception)) {
+                       return;
+               }
        }
        iter->funcs->dtor(iter TSRMLS_CC);
+       if (EG(exception)) {
+               return;
+       }
        
        RETURN_LONG(count);
 }