Issue #13560: os.strerror() now uses the current locale encoding instead of UTF-8
authorVictor Stinner <victor.stinner@haypocalc.com>
Sat, 17 Dec 2011 03:45:09 +0000 (04:45 +0100)
committerVictor Stinner <victor.stinner@haypocalc.com>
Sat, 17 Dec 2011 03:45:09 +0000 (04:45 +0100)
Misc/NEWS
Modules/posixmodule.c
Modules/socketmodule.c
Objects/unicodeobject.c
Python/errors.c

index 51505d45f986cb48adf997e3c887e746ad4abd25..286192ce72f87c9c1e43abeb3ebbe0cddf7e16c3 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -419,6 +419,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #13560: os.strerror() now uses the current locale encoding instead of
+  UTF-8.
+
 - Issue #13560: Add PyUnicode_DecodeLocale(), PyUnicode_DecodeLocaleAndSize()
   and PyUnicode_EncodeLocale() functions to the C API to decode/encode from/to
   the current locale encoding.
index 8ba2975a9daf36df2b018c6072d8e547616739ac..6b832c0a957f06ba2e1b1363851763baa6acec32 100644 (file)
@@ -7891,7 +7891,7 @@ posix_strerror(PyObject *self, PyObject *args)
                         "strerror() argument out of range");
         return NULL;
     }
-    return PyUnicode_FromString(message);
+    return PyUnicode_DecodeLocale(message, 1);
 }
 
 
index c828d49e39e52c39b92e42b4d17166e89a88effb..132d6c7780dd886fe9f038bfe9ae3d94029b4ede 100644 (file)
@@ -4032,9 +4032,8 @@ gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
 
     if (h->h_addrtype != af) {
         /* Let's get real error message to return */
-        PyErr_SetString(PyExc_OSError,
-                        (char *)strerror(EAFNOSUPPORT));
-
+        errno = EAFNOSUPPORT;
+        PyErr_SetFromErrno(PyExc_OSError);
         return NULL;
     }
 
index a2c3227df0b136eb0d83a6ab5c3a3ef3c3c93726..2fea30b37f8e4d073e79ba4451e3b71abbe0c725 100644 (file)
@@ -3132,6 +3132,7 @@ PyUnicode_EncodeLocale(PyObject *unicode, int surrogateescape)
     wchar_t *wstr;
     PyObject *bytes = NULL;
     char *errmsg;
+    PyObject *reason;
     PyObject *exc;
     size_t error_pos;
 
@@ -3193,17 +3194,28 @@ PyUnicode_EncodeLocale(PyObject *unicode, int surrogateescape)
 encode_error:
     errmsg = strerror(errno);
     assert(errmsg != NULL);
-    if (errmsg == NULL)
-        errmsg = "wcstombs() encountered an unencodable wide character";
     PyMem_Free(wstr);
     Py_XDECREF(bytes);
 
-    exc = NULL;
-    raise_encode_exception(&exc,
-        "locale", unicode,
-        error_pos, error_pos+1,
-        errmsg);
-    Py_XDECREF(exc);
+    if (errmsg != NULL)
+        reason = PyUnicode_DecodeLocale(errmsg, 1);
+    else
+        reason = PyUnicode_FromString(
+            "wcstombs() encountered an unencodable "
+            "wide character");
+    if (reason == NULL)
+        return NULL;
+
+    exc = PyObject_CallFunction(PyExc_UnicodeEncodeError, "sOnnO",
+                                "locale", unicode,
+                                (Py_ssize_t)error_pos,
+                                (Py_ssize_t)(error_pos+1),
+                                reason);
+    Py_DECREF(reason);
+    if (exc != NULL) {
+        PyCodec_StrictErrors(exc);
+        Py_XDECREF(exc);
+    }
     return NULL;
 }
 
index 36b8c545ac37ffdd5f8bc63c822777b95bcf24f4..122e444b82353612f46c81979c87927187a024af 100644 (file)
@@ -343,9 +343,7 @@ PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
     PyObject *message;
     PyObject *v, *args;
     int i = errno;
-#ifndef MS_WINDOWS
-    char *s;
-#else
+#ifdef MS_WINDOWS
     WCHAR *s_buf = NULL;
 #endif /* Unix/Windows */
 
@@ -355,11 +353,14 @@ PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
 #endif
 
 #ifndef MS_WINDOWS
-    if (i == 0)
-        s = "Error"; /* Sometimes errno didn't get set */
-    else
-        s = strerror(i);
-    message = PyUnicode_DecodeUTF8(s, strlen(s), "ignore");
+    if (i != 0) {
+        char *s = strerror(i);
+        message = PyUnicode_DecodeLocale(s, 1);
+    }
+    else {
+        /* Sometimes errno didn't get set */
+        message = PyUnicode_FromString("Error");
+    }
 #else
     if (i == 0)
         message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */