]> granicus.if.org Git - php/commitdiff
- Fix coverity issue 49: ce might be forwarded as NULL without an exception
authorMarcus Boerger <helly@php.net>
Mon, 10 Apr 2006 22:37:55 +0000 (22:37 +0000)
committerMarcus Boerger <helly@php.net>
Mon, 10 Apr 2006 22:37:55 +0000 (22:37 +0000)
  being thrown in case the Zend API is being used wrong (in custom exts for
  instance).

Zend/zend_interfaces.c

index fff11583da82fba44e86cd22cf46a594f6d32123..891d7fedc8476a0b627b0f5d95e095e06ae9e66a 100755 (executable)
@@ -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;