[Python-checkins] r53530 - in python/branches/release24-maint: Misc/NEWS Objects/fileobject.c Python/pythonrun.c Python/sysmodule.c

thomas.wouters python-checkins at python.org
Tue Jan 23 16:09:21 CET 2007


Author: thomas.wouters
Date: Tue Jan 23 16:09:19 2007
New Revision: 53530

Modified:
   python/branches/release24-maint/Misc/NEWS
   python/branches/release24-maint/Objects/fileobject.c
   python/branches/release24-maint/Python/pythonrun.c
   python/branches/release24-maint/Python/sysmodule.c
Log:

Backport trunk revision 53527:

SF patch #1630975: Fix crash when replacing sys.stdout in sitecustomize

When running the interpreter in an environment that would cause it to set
stdout/stderr/stdin's encoding, having a sitecustomize that would replace
them with something other than PyFile objects would crash the interpreter.
Fix it by simply ignoring the encoding-setting for non-files.

This could do with a test, but I can think of no maintainable and portable
way to test this bug, short of adding a sitecustomize.py to the buildsystem
and have it always run with it (hmmm....)



Modified: python/branches/release24-maint/Misc/NEWS
==============================================================================
--- python/branches/release24-maint/Misc/NEWS	(original)
+++ python/branches/release24-maint/Misc/NEWS	Tue Jan 23 16:09:19 2007
@@ -13,6 +13,8 @@
 Core and builtins
 -----------------
 
+- patch #1630975: Fix crash when replacing sys.stdout in sitecustomize.py
+
 - Bug #1590891: random.randrange don't return correct value for big number
 
 - Bug #1542016: make sys.callstats() match its docstring and return an

Modified: python/branches/release24-maint/Objects/fileobject.c
==============================================================================
--- python/branches/release24-maint/Objects/fileobject.c	(original)
+++ python/branches/release24-maint/Objects/fileobject.c	Tue Jan 23 16:09:19 2007
@@ -282,6 +282,8 @@
 {
 	PyFileObject *file = (PyFileObject*)f;
 	PyObject *str = PyString_FromString(enc);
+
+	assert(PyFile_Check(f));
 	if (!str)
 		return 0;
 	Py_DECREF(file->f_encoding);

Modified: python/branches/release24-maint/Python/pythonrun.c
==============================================================================
--- python/branches/release24-maint/Python/pythonrun.c	(original)
+++ python/branches/release24-maint/Python/pythonrun.c	Tue Jan 23 16:09:19 2007
@@ -257,7 +257,8 @@
 		sys_isatty = PyObject_CallMethod(sys_stream, "isatty", "");
 		if (!sys_isatty)
 			PyErr_Clear();
-		if(sys_isatty && PyObject_IsTrue(sys_isatty)) {
+		if(sys_isatty && PyObject_IsTrue(sys_isatty) &&
+		   PyFile_Check(sys_stream)) {
 			if (!PyFile_SetEncoding(sys_stream, codeset))
 				Py_FatalError("Cannot set codeset of stdin");
 		}
@@ -267,7 +268,8 @@
 		sys_isatty = PyObject_CallMethod(sys_stream, "isatty", "");
 		if (!sys_isatty)
 			PyErr_Clear();
-		if(sys_isatty && PyObject_IsTrue(sys_isatty)) {
+		if(sys_isatty && PyObject_IsTrue(sys_isatty) &&
+		   PyFile_Check(sys_stream)) {
 			if (!PyFile_SetEncoding(sys_stream, codeset))
 				Py_FatalError("Cannot set codeset of stdout");
 		}

Modified: python/branches/release24-maint/Python/sysmodule.c
==============================================================================
--- python/branches/release24-maint/Python/sysmodule.c	(original)
+++ python/branches/release24-maint/Python/sysmodule.c	Tue Jan 23 16:09:19 2007
@@ -972,12 +972,12 @@
 	if (PyErr_Occurred())
 		return NULL;
 #ifdef MS_WINDOWS
-	if(isatty(_fileno(stdin))){
+	if(isatty(_fileno(stdin)) && PyFile_Check(sysin)) {
 		sprintf(buf, "cp%d", GetConsoleCP());
 		if (!PyFile_SetEncoding(sysin, buf))
 			return NULL;
 	}
-	if(isatty(_fileno(stdout))) {
+	if(isatty(_fileno(stdout)) && PyFile_Check(sysout)) {
 		sprintf(buf, "cp%d", GetConsoleOutputCP());
 		if (!PyFile_SetEncoding(sysout, buf))
 			return NULL;


More information about the Python-checkins mailing list