From: Marcus Boerger Date: Mon, 10 Apr 2006 22:37:55 +0000 (+0000) Subject: - Fix coverity issue 49: ce might be forwarded as NULL without an exception X-Git-Tag: RELEASE_1_3~99 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=36b3b8ef63144a12ab0ef7d03a1c661a3996007d;p=php - Fix coverity issue 49: ce might be forwarded as NULL without an exception being thrown in case the Zend API is being used wrong (in custom exts for instance). --- diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c index fff11583da..891d7fedc8 100755 --- a/Zend/zend_interfaces.c +++ b/Zend/zend_interfaces.c @@ -292,18 +292,23 @@ static zend_object_iterator *zend_user_it_get_iterator(zend_class_entry *ce, zva /* {{{ zend_user_it_get_new_iterator */ ZEND_API zend_object_iterator *zend_user_it_get_new_iterator(zend_class_entry *ce, zval *object, int by_ref TSRMLS_DC) { - zval *iterator = zend_user_it_new_iterator(ce, object TSRMLS_CC); + zval *iterator; zend_object_iterator *new_iterator; + if (!ce) { + zend_error(E_ERROR, "Cannot create iterator without knowing the class type"); + return NULL; + } + + iterator = zend_user_it_new_iterator(ce, object TSRMLS_CC); + zend_class_entry *ce_it = iterator && Z_TYPE_P(iterator) == IS_OBJECT ? Z_OBJCE_P(iterator) : NULL; - if (!ce || !ce_it || !ce_it->get_iterator || (ce_it->get_iterator == zend_user_it_get_new_iterator && iterator == object)) { - if (!EG(exception)) - { + if (!ce_it || !ce_it->get_iterator || (ce_it->get_iterator == zend_user_it_get_new_iterator && iterator == object)) { + if (!EG(exception)) { zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Objects returned by %v::getIterator() must be traversable or implement interface Iterator", ce->name); } - if (iterator) - { + if (iterator) { zval_ptr_dtor(&iterator); } return NULL;