Commits

Raymond Hettinger  committed c2c49ee

SF patch #1020188: Use Py_CLEAR where necessary to avoid crashes
(Contributed by Dima Dorfman)

  • Participants
  • Parent commits 9f2ddde
  • Branches legacy-trunk

Comments (0)

Files changed (5)

File Include/object.h

 #define Py_CLEAR(op)				\
         do {                            	\
                 if (op) {			\
-                        PyObject *tmp = (op);	\
+                        PyObject *tmp = (PyObject *)(op);	\
                         (op) = NULL;		\
                         Py_DECREF(tmp);		\
                 }				\

File Modules/itertoolsmodule.c

 
 	r = gbo->currvalue;
 	gbo->currvalue = NULL;
-	Py_DECREF(gbo->currkey);
-	gbo->currkey = NULL;
+	Py_CLEAR(gbo->currkey);
 
 	return r;
 }

File Objects/enumobject.c

 			PyErr_Clear();
 	}
 	ro->index = -1;
-	if (ro->seq != NULL) {
-		Py_DECREF(ro->seq);
-		ro->seq = NULL;
-	}
+	Py_CLEAR(ro->seq);
 	return NULL;
 }
 

File Objects/genobject.c

 	 * may keep a chain of frames alive or it could create a reference
 	 * cycle. */
 	assert(f->f_back != NULL);
-	Py_DECREF(f->f_back);
-	f->f_back = NULL;
+	Py_CLEAR(f->f_back);
 
 	/* If the generator just returned (as opposed to yielding), signal
 	 * that the generator is exhausted. */

File Objects/iterobject.c

 				return result; /* Common case, fast path */
 			Py_DECREF(result);
 			if (ok > 0) {
-				Py_DECREF(it->it_callable);
-				it->it_callable = NULL;
-				Py_DECREF(it->it_sentinel);
-				it->it_sentinel = NULL;
+				Py_CLEAR(it->it_callable);
+				Py_CLEAR(it->it_sentinel);
 			}
 		}
 		else if (PyErr_ExceptionMatches(PyExc_StopIteration)) {
 			PyErr_Clear();
-			Py_DECREF(it->it_callable);
-			it->it_callable = NULL;
-			Py_DECREF(it->it_sentinel);
-			it->it_sentinel = NULL;
+			Py_CLEAR(it->it_callable);
+			Py_CLEAR(it->it_sentinel);
 		}
 	}
 	return NULL;