[Python-checkins] r80404 - in python/branches/py3k: Misc/NEWS Python/sysmodule.c

victor.stinner python-checkins at python.org
Fri Apr 23 14:02:31 CEST 2010


Author: victor.stinner
Date: Fri Apr 23 14:02:30 2010
New Revision: 80404

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


Modified:
   python/branches/py3k/Misc/NEWS
   python/branches/py3k/Python/sysmodule.c

Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS	(original)
+++ python/branches/py3k/Misc/NEWS	Fri Apr 23 14:02:30 2010
@@ -12,6 +12,10 @@
 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)
 

Modified: python/branches/py3k/Python/sysmodule.c
==============================================================================
--- python/branches/py3k/Python/sysmodule.c	(original)
+++ python/branches/py3k/Python/sysmodule.c	Fri Apr 23 14:02:30 2010
@@ -1763,6 +1763,45 @@
 	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.
@@ -1774,6 +1813,10 @@
       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.
 
@@ -1799,13 +1842,13 @@
 	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);
 		}


More information about the Python-checkins mailing list