Fix exception handling in itertools.izip_longest().
diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c
index 64e3606..f12d874 100644
--- a/Modules/itertoolsmodule.c
+++ b/Modules/itertoolsmodule.c
@@ -3865,71 +3865,73 @@
 static PyObject *
 izip_longest_next(iziplongestobject *lz)
 {
-	Py_ssize_t i;
-	Py_ssize_t tuplesize = lz->tuplesize;
-	PyObject *result = lz->result;
-	PyObject *it;
-	PyObject *item;
-	PyObject *olditem;
+        Py_ssize_t i;
+        Py_ssize_t tuplesize = lz->tuplesize;
+        PyObject *result = lz->result;
+        PyObject *it;
+        PyObject *item;
+        PyObject *olditem;
 
-	if (tuplesize == 0)
-		return NULL;
+        if (tuplesize == 0)
+                return NULL;
         if (lz->numactive == 0)
                 return NULL;
-	if (Py_REFCNT(result) == 1) {
-		Py_INCREF(result);
-		for (i=0 ; i < tuplesize ; i++) {
-			it = PyTuple_GET_ITEM(lz->ittuple, i);
+        if (Py_REFCNT(result) == 1) {
+                Py_INCREF(result);
+                for (i=0 ; i < tuplesize ; i++) {
+                        it = PyTuple_GET_ITEM(lz->ittuple, i);
                         if (it == NULL) {
                                 Py_INCREF(lz->fillvalue);
                                 item = lz->fillvalue;
                         } else {
-                                item = (*Py_TYPE(it)->tp_iternext)(it);
+                                item = PyIter_Next(it);
                                 if (item == NULL) {
-                                        lz->numactive -= 1;      
-                                        if (lz->numactive == 0) {
+                                        lz->numactive -= 1;
+                                        if (lz->numactive == 0 || PyErr_Occurred()) {
+                                                lz->numactive = 0;
                                                 Py_DECREF(result);
                                                 return NULL;
                                         } else {
                                                 Py_INCREF(lz->fillvalue);
-                                                item = lz->fillvalue;                                        
+                                                item = lz->fillvalue;
                                                 PyTuple_SET_ITEM(lz->ittuple, i, NULL);
                                                 Py_DECREF(it);
                                         }
                                 }
                         }
-			olditem = PyTuple_GET_ITEM(result, i);
-			PyTuple_SET_ITEM(result, i, item);
-			Py_DECREF(olditem);
-		}
-	} else {
-		result = PyTuple_New(tuplesize);
-		if (result == NULL)
-			return NULL;
-		for (i=0 ; i < tuplesize ; i++) {
-			it = PyTuple_GET_ITEM(lz->ittuple, i);
+                        olditem = PyTuple_GET_ITEM(result, i);
+                        PyTuple_SET_ITEM(result, i, item);
+                        Py_DECREF(olditem);
+                }
+        } else {
+                result = PyTuple_New(tuplesize);
+                if (result == NULL)
+                        return NULL;
+                for (i=0 ; i < tuplesize ; i++) {
+                        it = PyTuple_GET_ITEM(lz->ittuple, i);
                         if (it == NULL) {
                                 Py_INCREF(lz->fillvalue);
                                 item = lz->fillvalue;
                         } else {
-                                item = (*Py_TYPE(it)->tp_iternext)(it);
+                                item = PyIter_Next(it);
                                 if (item == NULL) {
-                                        lz->numactive -= 1;      
-                                        if (lz->numactive == 0) {
+                                        lz->numactive -= 1;
+                                        if (lz->numactive == 0 || PyErr_Occurred()) {
+                                                lz->numactive = 0;
                                                 Py_DECREF(result);
                                                 return NULL;
                                         } else {
                                                 Py_INCREF(lz->fillvalue);
-                                                item = lz->fillvalue;                                        
+                                                item = lz->fillvalue;
                                                 PyTuple_SET_ITEM(lz->ittuple, i, NULL);
                                                 Py_DECREF(it);
                                         }
                                 }
                         }
-			PyTuple_SET_ITEM(result, i, item);
-		}
-	}
-	return result;
+                        PyTuple_SET_ITEM(result, i, item);
+                }
+        }
+        return result;
 }
 
 PyDoc_STRVAR(izip_longest_doc,