]> granicus.if.org Git - python/commitdiff
Merged revisions 80404 via svnmerge from
authorVictor Stinner <victor.stinner@haypocalc.com>
Fri, 23 Apr 2010 12:04:53 +0000 (12:04 +0000)
committerVictor Stinner <victor.stinner@haypocalc.com>
Fri, 23 Apr 2010 12:04:53 +0000 (12:04 +0000)
svn+ssh://pythondev@svn.python.org/python/branches/py3k

........
  r80404 | victor.stinner | 2010-04-23 14:02:30 +0200 (ven., 23 avril 2010) | 4 lines

  Issue #8124: PySys_WriteStdout() and PySys_WriteStderr() don't execute
  indirectly Python signal handlers anymore because mywrite() ignores exceptions
  (KeyboardInterrupt).
........

Misc/NEWS
Python/sysmodule.c

index 32def3d759a5bb2192154f1c817c31f027deee29..980cd69d1cd329af461ee4d29bf74733ef4375e1 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,10 @@ What's New in Python 3.1.3?
 Core and Builtins
 -----------------
 
+- Issue #8124: PySys_WriteStdout() and PySys_WriteStderr() don't execute
+  indirectly Python signal handlers anymore because mywrite() ignores
+  exceptions (KeyboardInterrupt)
+
 - Issue #8092: Fix PyUnicode_EncodeUTF8() to support error handler producing
   unicode string (eg. backslashreplace)
 
index c87fd824554b5b1e67292bce1bf4ef66155b9331..69ee9c1fe89303197d439b5843768401a9f414a3 100644 (file)
@@ -1655,6 +1655,45 @@ PySys_SetArgv(int argc, wchar_t **argv)
        Py_DECREF(av);
 }
 
+/* Reimplementation of PyFile_WriteString() no calling indirectly
+   PyErr_CheckSignals(): avoid the call to PyObject_Str(). */
+
+static int
+sys_pyfile_write(const char *text, PyObject *file)
+{
+       PyObject *unicode = NULL, *writer = NULL, *args = NULL, *result = NULL;
+       int err;
+
+       unicode = PyUnicode_FromString(text);
+       if (unicode == NULL)
+               goto error;
+
+       writer = PyObject_GetAttrString(file, "write");
+       if (writer == NULL)
+               goto error;
+
+       args = PyTuple_Pack(1, unicode);
+       if (args == NULL)
+               goto error;
+
+       result = PyEval_CallObject(writer, args);
+       if (result == NULL) {
+               goto error;
+       } else {
+               err = 0;
+               goto finally;
+       }
+
+error:
+       err = -1;
+finally:
+       Py_XDECREF(unicode);
+       Py_XDECREF(writer);
+       Py_XDECREF(args);
+       Py_XDECREF(result);
+       return err;
+}
+
 
 /* APIs to write to sys.stdout or sys.stderr using a printf-like interface.
    Adapted from code submitted by Just van Rossum.
@@ -1666,6 +1705,10 @@ PySys_SetArgv(int argc, wchar_t **argv)
       there is a problem, they write to the real (C level) stdout or stderr;
       no exceptions are raised.
 
+      PyErr_CheckSignals() is not called to avoid the execution of the Python
+      signal handlers: they may raise a new exception whereas mywrite() ignores
+      all exceptions.
+
       Both take a printf-style format string as their first argument followed
       by a variable length argument list determined by the format string.
 
@@ -1691,13 +1734,13 @@ mywrite(char *name, FILE *fp, const char *format, va_list va)
        PyErr_Fetch(&error_type, &error_value, &error_traceback);
        file = PySys_GetObject(name);
        written = PyOS_vsnprintf(buffer, sizeof(buffer), format, va);
-       if (PyFile_WriteString(buffer, file) != 0) {
+       if (sys_pyfile_write(buffer, file) != 0) {
                PyErr_Clear();
                fputs(buffer, fp);
        }
        if (written < 0 || (size_t)written >= sizeof(buffer)) {
                const char *truncated = "... truncated";
-               if (PyFile_WriteString(truncated, file) != 0) {
+               if (sys_pyfile_write(truncated, file) != 0) {
                        PyErr_Clear();
                        fputs(truncated, fp);
                }