[Python-checkins] r80403 - in python/branches/release31-maint: Misc/NEWS Modules/bz2module.c

victor.stinner python-checkins at python.org
Fri Apr 23 13:19:15 CEST 2010


Author: victor.stinner
Date: Fri Apr 23 13:19:05 2010
New Revision: 80403

Log:
Merged revisions 80402 via svnmerge from 
svn+ssh://pythondev@svn.python.org/python/branches/py3k

........
  r80402 | victor.stinner | 2010-04-23 12:56:17 +0200 (ven., 23 avril 2010) | 2 lines
  
  Issue #8468: bz2.BZ2File() accepts str with surrogates and bytes filenames
........


Modified:
   python/branches/release31-maint/   (props changed)
   python/branches/release31-maint/Misc/NEWS
   python/branches/release31-maint/Modules/bz2module.c

Modified: python/branches/release31-maint/Misc/NEWS
==============================================================================
--- python/branches/release31-maint/Misc/NEWS	(original)
+++ python/branches/release31-maint/Misc/NEWS	Fri Apr 23 13:19:05 2010
@@ -36,6 +36,8 @@
 Library
 -------
 
+- Issue #8468: bz2.BZ2File() accepts str with surrogates and bytes filenames
+
 - Issue #8496: make mailcap.lookup() always return a list, rather than an
   iterator.  Patch by Gregory Nofi.
 

Modified: python/branches/release31-maint/Modules/bz2module.c
==============================================================================
--- python/branches/release31-maint/Modules/bz2module.c	(original)
+++ python/branches/release31-maint/Modules/bz2module.c	Fri Apr 23 13:19:05 2010
@@ -1162,6 +1162,7 @@
 {
 	static char *kwlist[] = {"filename", "mode", "buffering",
 				 "compresslevel", 0};
+	PyObject *name_obj = NULL;
 	char *name;
 	char *mode = "r";
 	int buffering = -1;
@@ -1171,14 +1172,20 @@
 
 	self->size = -1;
 
-	if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|sii:BZ2File",
-					 kwlist, &name, &mode, &buffering,
+	if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&|sii:BZ2File",
+					 kwlist, PyUnicode_FSConverter, &name_obj,
+					 &mode, &buffering,
 					 &compresslevel))
 		return -1;
 
+	if (PyBytes_Check(name_obj))
+		name = PyBytes_AsString(name_obj);
+	else
+		name = PyByteArray_AsString(name_obj);
 	if (compresslevel < 1 || compresslevel > 9) {
 		PyErr_SetString(PyExc_ValueError,
 				"compresslevel must be between 1 and 9");
+		Py_DECREF(name_obj);
 		return -1;
 	}
 
@@ -1202,6 +1209,7 @@
 		if (error) {
 			PyErr_Format(PyExc_ValueError,
 				     "invalid mode char %c", *mode);
+			Py_DECREF(name_obj);
 			return -1;
 		}
 		mode++;
@@ -1216,6 +1224,7 @@
 	mode = (mode_char == 'r') ? "rb" : "wb";
 
 	self->rawfp = fopen(name, mode);
+	Py_DECREF(name_obj);
 	if (self->rawfp == NULL) {
 		PyErr_SetFromErrno(PyExc_IOError);
 		return -1;


More information about the Python-checkins mailing list