From a534fc4b3bd4b731be9304be626bc161f53d7bfb Mon Sep 17 00:00:00 2001
From: Victor Stinner <victor.stinner@gmail.com>
Date: Mon, 3 Jun 2013 22:07:27 +0200
Subject: [PATCH] Close #18109: os.uname() now decodes fields from the locale
 encoding, and socket.gethostname() now decodes the hostname from the locale
 encoding, instead of using the UTF-8 encoding in strict mode.

---
 Misc/NEWS              |  6 +++++-
 Modules/posixmodule.c  |  2 +-
 Modules/socketmodule.c | 16 ++++++++--------
 3 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/Misc/NEWS b/Misc/NEWS
index 69b4bafe8e..15a91b2349 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -24,6 +24,10 @@ Core and Builtins
 Library
 -------
 
+- Issue #18109: os.uname() now decodes fields from the locale encoding, and
+  socket.gethostname() now decodes the hostname from the locale encoding,
+  instead of using the UTF-8 encoding in strict mode.
+
 - Issue #17403: urllib.parse.robotparser normalizes the urls before adding to
   ruleline. This helps in handling certain types invalid urls in a conservative
   manner.
@@ -69,7 +73,7 @@ IDLE
 
 - Issue #15392: Create a unittest framework for IDLE.
   Initial patch by Rajagopalasarma Jayakrishnan.
-  
+
 - Issue #14146: Highlight source line while debugging on Windows.
 
 - Issue #17532: Always include Options menu for IDLE on OS X.
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index 7c96a67ea9..3b4b5704ec 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -4514,7 +4514,7 @@ posix_uname(PyObject *self, PyObject *noargs)
 
 #define SET(i, field) \
     { \
-    PyObject *o = PyUnicode_DecodeASCII(field, strlen(field), NULL); \
+    PyObject *o = PyUnicode_DecodeFSDefault(field); \
     if (!o) { \
         Py_DECREF(value); \
         return NULL; \
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index 679143cc93..b9579283f8 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -1702,7 +1702,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
             return 0;
         }
 #endif
-            
+
 #ifdef PF_SYSTEM
     case PF_SYSTEM:
         switch (s->sock_proto) {
@@ -1710,10 +1710,10 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
         case SYSPROTO_CONTROL:
         {
             struct sockaddr_ctl *addr;
-            
+
             addr = (struct sockaddr_ctl *)addr_ret;
             addr->sc_family = AF_SYSTEM;
-            addr->ss_sysaddr = AF_SYS_CONTROL; 
+            addr->ss_sysaddr = AF_SYS_CONTROL;
 
             if (PyUnicode_Check(args)) {
                 struct ctl_info info;
@@ -1739,17 +1739,17 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
                           "cannot find kernel control with provided name");
                     return 0;
                 }
-                
+
                 addr->sc_id = info.ctl_id;
                 addr->sc_unit = 0;
             } else if (!PyArg_ParseTuple(args, "II",
                                          &(addr->sc_id), &(addr->sc_unit))) {
                 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
                                 "expected str or tuple of two ints");
-                
+
                 return 0;
             }
-              
+
             *len_ret = sizeof(*addr);
             return 1;
         }
@@ -1866,7 +1866,7 @@ getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
         return 1;
     }
 #endif
-            
+
 #ifdef PF_SYSTEM
     case PF_SYSTEM:
         switch(s->sock_proto) {
@@ -4111,7 +4111,7 @@ socket_gethostname(PyObject *self, PyObject *unused)
     if (res < 0)
         return set_error();
     buf[sizeof buf - 1] = '\0';
-    return PyUnicode_FromString(buf);
+    return PyUnicode_DecodeFSDefault(buf);
 #endif
 }
 
-- 
2.40.0