[Python-checkins] cpython: Issue #13560: os.strerror() now uses the current locale encoding instead of

victor.stinner python-checkins at python.org
Sat Dec 17 04:46:07 CET 2011


http://hg.python.org/cpython/rev/51412b4b81ae
changeset:   74007:51412b4b81ae
user:        Victor Stinner <victor.stinner at haypocalc.com>
date:        Sat Dec 17 04:45:09 2011 +0100
summary:
  Issue #13560: os.strerror() now uses the current locale encoding instead of UTF-8

files:
  Misc/NEWS               |   3 +++
  Modules/posixmodule.c   |   2 +-
  Modules/socketmodule.c  |   5 ++---
  Objects/unicodeobject.c |  28 ++++++++++++++++++++--------
  Python/errors.c         |  17 +++++++++--------
  5 files changed, 35 insertions(+), 20 deletions(-)


diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -419,6 +419,9 @@
 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.
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -7891,7 +7891,7 @@
                         "strerror() argument out of range");
         return NULL;
     }
-    return PyUnicode_FromString(message);
+    return PyUnicode_DecodeLocale(message, 1);
 }
 
 
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -4032,9 +4032,8 @@
 
     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;
     }
 
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -3132,6 +3132,7 @@
     wchar_t *wstr;
     PyObject *bytes = NULL;
     char *errmsg;
+    PyObject *reason;
     PyObject *exc;
     size_t error_pos;
 
@@ -3193,17 +3194,28 @@
 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;
 }
 
diff --git a/Python/errors.c b/Python/errors.c
--- a/Python/errors.c
+++ b/Python/errors.c
@@ -343,9 +343,7 @@
     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 @@
 #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 */

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list