]> granicus.if.org Git - python/commitdiff
Revert r81171 (posix_listdir(), posix_readlink(): avoid temporary PyBytes object)
authorVictor Stinner <victor.stinner@haypocalc.com>
Fri, 14 May 2010 18:07:39 +0000 (18:07 +0000)
committerVictor Stinner <victor.stinner@haypocalc.com>
Fri, 14 May 2010 18:07:39 +0000 (18:07 +0000)
PyUnicode_DecodeFSDefault*() doesn't use surrogateescape error handler, and so
PyUnicode_FromEncodedObject(v, Py_FileSystemDefaultEncoding, "surrogateescape")
cannot be replaced by PyUnicode_DecodeFSDefault().

It's a bad idea to try to fix surrogates things in Python 3.1...

Modules/posixmodule.c

index 9ce896623f900ce56ffee8cd6ca1166af7fba7b3..590a47b068a07aa7b327b55d902ee3047a98ef7d 100644 (file)
@@ -2515,17 +2515,33 @@ posix_listdir(PyObject *self, PyObject *args)
             (NAMLEN(ep) == 1 ||
              (ep->d_name[1] == '.' && NAMLEN(ep) == 2)))
             continue;
-        if (arg_is_unicode)
-            v = PyUnicode_DecodeFSDefaultAndSize(ep->d_name, NAMLEN(ep));
-        else
-            v = PyBytes_FromStringAndSize(ep->d_name, NAMLEN(ep));
+        v = PyBytes_FromStringAndSize(ep->d_name, NAMLEN(ep));
         if (v == NULL) {
-            Py_CLEAR(d);
+            Py_DECREF(d);
+            d = NULL;
             break;
         }
+        if (arg_is_unicode) {
+            PyObject *w;
+
+            w = PyUnicode_FromEncodedObject(v,
+                                            Py_FileSystemDefaultEncoding,
+                                            "surrogateescape");
+            Py_DECREF(v);
+            if (w != NULL)
+                v = w;
+            else {
+                /* Encoding failed to decode ASCII bytes.
+                   Raise exception. */
+                Py_DECREF(d);
+                d = NULL;
+                break;
+            }
+        }
         if (PyList_Append(d, v) != 0) {
             Py_DECREF(v);
-            Py_CLEAR(d);
+            Py_DECREF(d);
+            d = NULL;
             break;
         }
         Py_DECREF(v);
@@ -4660,10 +4676,22 @@ posix_readlink(PyObject *self, PyObject *args)
         return posix_error_with_allocated_filename(opath);
 
     release_bytes(opath);
-    if (arg_is_unicode)
-        return PyUnicode_DecodeFSDefaultAndSize(buf, n);
-    else
-        return PyBytes_FromStringAndSize(buf, n);
+    v = PyBytes_FromStringAndSize(buf, n);
+    if (arg_is_unicode) {
+        PyObject *w;
+
+        w = PyUnicode_FromEncodedObject(v,
+                                        Py_FileSystemDefaultEncoding,
+                                        "surrogateescape");
+        if (w != NULL) {
+            Py_DECREF(v);
+            v = w;
+        }
+        else {
+            v = NULL;
+        }
+    }
+    return v;
 }
 #endif /* HAVE_READLINK */