]> granicus.if.org Git - php/commitdiff
- Some pretection against out-of-memory situations
authorMarcus Boerger <helly@php.net>
Tue, 27 Apr 2004 17:12:11 +0000 (17:12 +0000)
committerMarcus Boerger <helly@php.net>
Tue, 27 Apr 2004 17:12:11 +0000 (17:12 +0000)
ext/spl/spl_iterators.c

index c843cfaa99b6605581230cb3977a08d94d6fa943..a9d2d3737b5aaf1f7e879bd6ac294de15ac60a90 100755 (executable)
@@ -230,9 +230,11 @@ next_step:
                                ce = object->iterators[object->level].ce;
                                zobject = object->iterators[object->level].zobject;
                                zend_call_method_with_0_params(&zobject, ce, NULL, "getchildren", &child);
-                               ce = Z_OBJCE_P(child);
+                               ce = child ? Z_OBJCE_P(child) : NULL;
                                if (!ce || !instanceof_function(ce, spl_ce_RecursiveIterator TSRMLS_CC)) {
-                                       zval_ptr_dtor(&child);
+                                       if (child) {
+                                               zval_ptr_dtor(&child);
+                                       }
                                        zend_throw_exception(zend_exception_get_default(), "Objects returned by RecursiveIterator::getChildren() must implement RecursiveIterator", 0 TSRMLS_CC);
                                        return;
                                }
@@ -610,7 +612,7 @@ SPL_METHOD(dual_it, getInnerIterator)
 
 static INLINE void spl_dual_it_free(spl_dual_it_object *intern TSRMLS_DC)
 {
-       if (intern->inner.iterator->funcs->invalidate_current) {
+       if (intern->inner.iterator && intern->inner.iterator->funcs->invalidate_current) {
                intern->inner.iterator->funcs->invalidate_current(intern->inner.iterator TSRMLS_CC);
        }
        if (intern->current.data) {
@@ -740,11 +742,13 @@ static INLINE void spl_filter_it_fetch(zval *zthis, spl_dual_it_object *intern T
 
        while (spl_dual_it_fetch(intern, 1 TSRMLS_CC) == SUCCESS) {
                zend_call_method_with_0_params(&zthis, intern->std.ce, NULL, "accept", &retval);
-               if (zend_is_true(retval)) {
+               if (retval) {
+                       if (zend_is_true(retval)) {
+                               zval_ptr_dtor(&retval);
+                               return;
+                       }
                        zval_ptr_dtor(&retval);
-                       return;
                }
-               zval_ptr_dtor(&retval);
 
                intern->inner.iterator->funcs->move_forward(intern->inner.iterator TSRMLS_CC);
        }