]> granicus.if.org Git - python/commitdiff
Issue #19437: Fix show_warning() of _warnings, stop at the first error to not
authorVictor Stinner <victor.stinner@gmail.com>
Thu, 31 Oct 2013 13:51:38 +0000 (14:51 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Thu, 31 Oct 2013 13:51:38 +0000 (14:51 +0100)
call a Python function with an exception set

Python/_warnings.c

index 74ac8c65bffffcb75f50bd64a21dec16a6521457..d9f3297dd3d1246f1f70721f1257e67e6024ef09 100644 (file)
@@ -263,23 +263,28 @@ show_warning(PyObject *filename, int lineno, PyObject *text, PyObject
 
     name = _PyObject_GetAttrId(category, &PyId___name__);
     if (name == NULL)  /* XXX Can an object lack a '__name__' attribute? */
-        return;
+        goto error;
 
     f_stderr = PySys_GetObject("stderr");
     if (f_stderr == NULL) {
         fprintf(stderr, "lost sys.stderr\n");
-        Py_DECREF(name);
-        return;
+        goto error;
     }
 
     /* Print "filename:lineno: category: text\n" */
-    PyFile_WriteObject(filename, f_stderr, Py_PRINT_RAW);
-    PyFile_WriteString(lineno_str, f_stderr);
-    PyFile_WriteObject(name, f_stderr, Py_PRINT_RAW);
-    PyFile_WriteString(": ", f_stderr);
-    PyFile_WriteObject(text, f_stderr, Py_PRINT_RAW);
-    PyFile_WriteString("\n", f_stderr);
-    Py_XDECREF(name);
+    if (PyFile_WriteObject(filename, f_stderr, Py_PRINT_RAW) < 0)
+        goto error;
+    if (PyFile_WriteString(lineno_str, f_stderr) < 0)
+        goto error;
+    if (PyFile_WriteObject(name, f_stderr, Py_PRINT_RAW) < 0)
+        goto error;
+    if (PyFile_WriteString(": ", f_stderr) < 0)
+        goto error;
+    if (PyFile_WriteObject(text, f_stderr, Py_PRINT_RAW) < 0)
+        goto error;
+    if (PyFile_WriteString("\n", f_stderr) < 0)
+        goto error;
+    Py_CLEAR(name);
 
     /* Print "  source_line\n" */
     if (sourceline) {
@@ -314,6 +319,7 @@ show_warning(PyObject *filename, int lineno, PyObject *text, PyObject
     }
 
 error:
+    Py_XDECREF(name);
     PyErr_Clear();
 }