From 11690da1647d2ea06e39fa06c4c2c412ac2dda40 Mon Sep 17 00:00:00 2001 From: Marcus Boerger Date: Tue, 27 Apr 2004 17:12:11 +0000 Subject: [PATCH] - Some pretection against out-of-memory situations --- ext/spl/spl_iterators.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/ext/spl/spl_iterators.c b/ext/spl/spl_iterators.c index c843cfaa99..a9d2d3737b 100755 --- a/ext/spl/spl_iterators.c +++ b/ext/spl/spl_iterators.c @@ -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); } -- 2.40.0