]> granicus.if.org Git - python/commitdiff
Issue #23571: PyErr_FormatV() and PyErr_SetObject() now always clear the
authorVictor Stinner <victor.stinner@gmail.com>
Tue, 24 Mar 2015 11:41:23 +0000 (12:41 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Tue, 24 Mar 2015 11:41:23 +0000 (12:41 +0100)
current exception because they can run arbitrary Python code and so no
exception must be set.

Python/errors.c

index 1d64efd3158b928ed4c81e4e807d1323ad708e9d..17e3bcce835f44eccd10e486ece6b42e4ee9cdeb 100644 (file)
@@ -74,11 +74,11 @@ PyErr_SetObject(PyObject *exception, PyObject *value)
         if (value == NULL || !PyExceptionInstance_Check(value)) {
             /* We must normalize the value right now */
             PyObject *args, *fixed_value;
-#ifdef Py_DEBUG
-            /* in debug mode, PyEval_EvalFrameEx() fails with an assertion
-               error if an exception is set when it is called */
+
+            /* Issue #23571: PyEval_CallObject() must not be called with an
+               exception set */
             PyErr_Clear();
-#endif
+
             if (value == NULL || value == Py_None)
                 args = PyTuple_New(0);
             else if (PyTuple_Check(value)) {
@@ -778,13 +778,12 @@ PyErr_FormatV(PyObject *exception, const char *format, va_list vargs)
 {
     PyObject* string;
 
-#ifdef Py_DEBUG
-    /* in debug mode, PyEval_EvalFrameEx() fails with an assertion error
-       if an exception is set when it is called */
+    /* Issue #23571: PyUnicode_FromFormatV() must not be called with an
+       exception set, it calls arbitrary Python code like PyObject_Repr() */
     PyErr_Clear();
-#endif
 
     string = PyUnicode_FromFormatV(format, vargs);
+
     PyErr_SetObject(exception, string);
     Py_XDECREF(string);
     return NULL;