]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #9579, #9580: Fix os.confstr() for value longer than 255 bytes and encode
authorVictor Stinner <victor.stinner@haypocalc.com>
Fri, 10 Sep 2010 23:49:04 +0000 (23:49 +0000)
committerVictor Stinner <victor.stinner@haypocalc.com>
Fri, 10 Sep 2010 23:49:04 +0000 (23:49 +0000)
the value with filesystem encoding and surrogateescape (instead of utf-8 in
strict mode).

Misc/NEWS
Modules/posixmodule.c

index 579fc045cecfdc130419308208367ce759ebb67e..007629f0a9990b4eda22b40a46dd0874a0553417 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -29,6 +29,10 @@ Core and Builtins
 Library
 -------
 
+- Issue #9579, #9580: Fix os.confstr() for value longer than 255 bytes and
+  encode the value with filesystem encoding and surrogateescape (instead of
+  utf-8 in strict mode).
+
 - Issue #9632: Remove sys.setfilesystemencoding() function: use
   PYTHONFSENCODING environment variable to set the filesystem encoding at
   Python startup. sys.setfilesystemencoding() creates inconsistencies because
index 58b12060cbf1c4de897b57bd0d636337c5c01d41..82bbd91964220fcc799bb8e8785b4a114117ff7c 100644 (file)
@@ -6721,32 +6721,34 @@ posix_confstr(PyObject *self, PyObject *args)
 {
     PyObject *result = NULL;
     int name;
-    char buffer[256];
-
-    if (PyArg_ParseTuple(args, "O&:confstr", conv_confstr_confname, &name)) {
+    char buffer[255];
         int len;
 
-        errno = 0;
-        len = confstr(name, buffer, sizeof(buffer));
-        if (len == 0) {
-            if (errno) {
-                posix_error();
-            }
-            else {
-                result = Py_None;
-                Py_INCREF(Py_None);
-            }
+    if (!PyArg_ParseTuple(args, "O&:confstr", conv_confstr_confname, &name))
+        return NULL;
+
+    errno = 0;
+    len = confstr(name, buffer, sizeof(buffer));
+    if (len == 0) {
+        if (errno) {
+            posix_error();
+            return NULL;
         }
         else {
-            if ((unsigned int)len >= sizeof(buffer)) {
-                result = PyUnicode_FromStringAndSize(NULL, len-1);
-                if (result != NULL)
-                    confstr(name, _PyUnicode_AsString(result), len);
-            }
-            else
-                result = PyUnicode_FromStringAndSize(buffer, len-1);
+            Py_RETURN_NONE;
         }
     }
+
+    if ((unsigned int)len >= sizeof(buffer)) {
+        char *buf = PyMem_Malloc(len);
+        if (buf == NULL)
+            return PyErr_NoMemory();
+        confstr(name, buf, len);
+        result = PyUnicode_DecodeFSDefaultAndSize(buf, len-1);
+        PyMem_Free(buf);
+    }
+    else
+        result = PyUnicode_DecodeFSDefaultAndSize(buffer, len-1);
     return result;
 }
 #endif