From: Marcus Boerger Date: Wed, 28 Jul 2004 22:53:10 +0000 (+0000) Subject: - Fix problem when inner constructor isn't called from derived constructor X-Git-Tag: PRE_ZEND_VM_DISPATCH_PATCH~332 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b1326c1c24be4d50d7723fa6b142939bf3afcd7f;p=php - Fix problem when inner constructor isn't called from derived constructor (foound by david) --- diff --git a/ext/spl/spl_iterators.c b/ext/spl/spl_iterators.c index f0a768c2c0..3d09a7c463 100755 --- a/ext/spl/spl_iterators.c +++ b/ext/spl/spl_iterators.c @@ -634,8 +634,16 @@ SPL_METHOD(dual_it, getInnerIterator) } } /* }}} */ +static INLINE void spl_dual_it_require(spl_dual_it_object *intern TSRMLS_DC) +{ + if (!intern->inner.iterator) { + php_error_docref(NULL TSRMLS_CC, E_ERROR, "The inner constructor wasn't initialized with an iterator instance"); + } +} + static INLINE void spl_dual_it_free(spl_dual_it_object *intern TSRMLS_DC) { + spl_dual_it_require(intern TSRMLS_CC); if (intern->inner.iterator && intern->inner.iterator->funcs->invalidate_current) { intern->inner.iterator->funcs->invalidate_current(intern->inner.iterator TSRMLS_CC); } @@ -698,6 +706,8 @@ static INLINE void spl_dual_it_next(spl_dual_it_object *intern, int do_free TSRM { if (do_free) { spl_dual_it_free(intern TSRMLS_CC); + } else { + spl_dual_it_require(intern TSRMLS_CC); } intern->inner.iterator->funcs->move_forward(intern->inner.iterator TSRMLS_CC); intern->current.pos++;