[Python-checkins] r66620 - in python/trunk: Lib/test/test_file.py Misc/NEWS Objects/fileobject.c

amaury.forgeotdarc python-checkins at python.org
Thu Sep 25 22:52:56 CEST 2008


Author: amaury.forgeotdarc
Date: Thu Sep 25 22:52:56 2008
New Revision: 66620

Log:
#3965: on Windows, open() crashes if the filename or the mode is invalid,
and if the filename is a unicode string.

Reviewed by Martin von Loewis.


Modified:
   python/trunk/Lib/test/test_file.py
   python/trunk/Misc/NEWS
   python/trunk/Objects/fileobject.c

Modified: python/trunk/Lib/test/test_file.py
==============================================================================
--- python/trunk/Lib/test/test_file.py	(original)
+++ python/trunk/Lib/test/test_file.py	Thu Sep 25 22:52:56 2008
@@ -134,6 +134,16 @@
                 f.close()
                 self.fail('%r is an invalid file mode' % mode)
 
+        # Some invalid modes fail on Windows, but pass on Unix
+        # Issue3965: avoid a crash on Windows when filename is unicode
+        for name in (TESTFN, unicode(TESTFN), unicode(TESTFN + '\t')):
+            try:
+                f = open(name, "rr")
+            except IOError:
+                pass
+            else:
+                f.close()
+
     def testStdin(self):
         # This causes the interpreter to exit on OSF1 v5.1.
         if sys.platform != 'osf1V5':

Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS	(original)
+++ python/trunk/Misc/NEWS	Thu Sep 25 22:52:56 2008
@@ -12,6 +12,9 @@
 Core and Builtins
 -----------------
 
+- Issue #3965: Fixed a crash on Windows when open() is given an invalid
+  filename or mode, and the filename is a unicode string.
+
 - Bug #3951: Py_USING_MEMORY_DEBUGGER should not be enabled by default.
 
 Library

Modified: python/trunk/Objects/fileobject.c
==============================================================================
--- python/trunk/Objects/fileobject.c	(original)
+++ python/trunk/Objects/fileobject.c	Thu Sep 25 22:52:56 2008
@@ -305,10 +305,17 @@
 #endif
                 /* EINVAL is returned when an invalid filename or
                  * an invalid mode is supplied. */
-		if (errno == EINVAL)
-			PyErr_Format(PyExc_IOError,
-                                     "invalid filename: %s or mode: %s",
-				     name, mode);
+		if (errno == EINVAL) {
+			PyObject *v;
+			char message[100];
+			PyOS_snprintf(message, 100, 
+			    "invalid mode ('%.50s') or filename", mode);
+			v = Py_BuildValue("(isO)", errno, message, f->f_name);
+			if (v != NULL) {
+				PyErr_SetObject(PyExc_IOError, v);
+				Py_DECREF(v);
+			}
+		}
 		else
 			PyErr_SetFromErrnoWithFilenameObject(PyExc_IOError, f->f_name);
 		f = NULL;


More information about the Python-checkins mailing list