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

diff --git a/NEWS b/NEWS
index 7cd1ed7b8b0cd2268a2dfd96b22e7483f18b234b..4e73317e3d284163f95888c32f1f5ff009bc6cbd 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -19,6 +19,8 @@
 - Added support for Apache 2.2 handler in the Windows distro. (Edin)
 - Added pg_field_table() function. (Edin)
 - Add implementation of curl_multi_info_read (Brian)
+- Fixed bug #37416 (iterator_to_array() hides exceptions thrown in rewind()
+  method). (Tony)
 - Fixed bug #37413 (Rejected versions of flex that don't work). (Ilia)
 - Fixed bug #37394 (substr_compare() returns an error when offset equals 
   string length). (Ilia)
index 0280a32c33600ebe66248e27b0bada4528a7db28..1a40ad4db1cb7a8486a9cf509b52667bc29c665e 100755 (executable)
@@ -2395,11 +2395,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, str_key_len, *data);
@@ -2413,8 +2422,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;
+       }
 }
 /* }}} */
 
@@ -2435,11 +2450,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);
 }