]> granicus.if.org Git - python/commitdiff
Merged revisions 80402 via svnmerge from
authorVictor Stinner <victor.stinner@haypocalc.com>
Fri, 23 Apr 2010 11:19:05 +0000 (11:19 +0000)
committerVictor Stinner <victor.stinner@haypocalc.com>
Fri, 23 Apr 2010 11:19:05 +0000 (11:19 +0000)
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
........

Misc/NEWS
Modules/bz2module.c

index 764e3a59db507a078cf3cc516184bf26acffa406..32def3d759a5bb2192154f1c817c31f027deee29 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -36,6 +36,8 @@ Core and Builtins
 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.
 
index 550f1cf9999102252e3c88e83ff2cfe6a98607a1..3e8eb8ba4010d33e213a756ac133a776207545b3 100644 (file)
@@ -1162,6 +1162,7 @@ BZ2File_init(BZ2FileObject *self, PyObject *args, PyObject *kwargs)
 {
        static char *kwlist[] = {"filename", "mode", "buffering",
                                 "compresslevel", 0};
+       PyObject *name_obj = NULL;
        char *name;
        char *mode = "r";
        int buffering = -1;
@@ -1171,14 +1172,20 @@ BZ2File_init(BZ2FileObject *self, PyObject *args, PyObject *kwargs)
 
        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 @@ BZ2File_init(BZ2FileObject *self, PyObject *args, PyObject *kwargs)
                if (error) {
                        PyErr_Format(PyExc_ValueError,
                                     "invalid mode char %c", *mode);
+                       Py_DECREF(name_obj);
                        return -1;
                }
                mode++;
@@ -1216,6 +1224,7 @@ BZ2File_init(BZ2FileObject *self, PyObject *args, PyObject *kwargs)
        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;