summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2004-04-27 17:12:11 +0000
committerMarcus Boerger <helly@php.net>2004-04-27 17:12:11 +0000
commit11690da1647d2ea06e39fa06c4c2c412ac2dda40 (patch)
tree6e09329ac5833c4cde1ffd42eb9c00fa68d66554
parentc56ca79733f536e1d59bb63fa472358e09a6ab7a (diff)
downloadphp-git-11690da1647d2ea06e39fa06c4c2c412ac2dda40.tar.gz
- Some pretection against out-of-memory situations
-rwxr-xr-xext/spl/spl_iterators.c16
1 files 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);
}