changeset: 100091:0681f0a1fe6e branch: 3.5 parent: 100089:c9423e481663 user: Victor Stinner date: Thu Jan 28 15:41:01 2016 +0100 files: Misc/NEWS Modules/socketmodule.c description: Windows: Decode hostname from ANSI code page Issue #26227: On Windows, getnameinfo(), gethostbyaddr() and gethostbyname_ex() functions of the socket module now decode the hostname from the ANSI code page rather than UTF-8. diff -r c9423e481663 -r 0681f0a1fe6e Misc/NEWS --- a/Misc/NEWS Thu Jan 28 12:42:26 2016 +0200 +++ b/Misc/NEWS Thu Jan 28 15:41:01 2016 +0100 @@ -66,6 +66,10 @@ Library ------- +- Issue #26227: On Windows, getnameinfo(), gethostbyaddr() and + gethostbyname_ex() functions of the socket module now decode the hostname + from the ANSI code page rather than UTF-8. + - Issue #26147: xmlrpc now works with strings not encodable with used non-UTF-8 encoding. diff -r c9423e481663 -r 0681f0a1fe6e Modules/socketmodule.c --- a/Modules/socketmodule.c Thu Jan 28 12:42:26 2016 +0200 +++ b/Modules/socketmodule.c Thu Jan 28 15:41:01 2016 +0100 @@ -4519,6 +4519,19 @@ Return the IP address (a string of the form '255.255.255.255') for a host."); +static PyObject* +sock_decode_hostname(const char *name) +{ +#ifdef MS_WINDOWS + /* Issue #26227: gethostbyaddr() returns a string encoded + * to the ANSI code page */ + return PyUnicode_DecodeFSDefault(name); +#else + /* Decode from UTF-8 */ + return PyUnicode_FromString(name); +#endif +} + /* Convenience function common to gethostbyname_ex and gethostbyaddr */ static PyObject * @@ -4529,6 +4542,7 @@ PyObject *name_list = (PyObject *)NULL; PyObject *addr_list = (PyObject *)NULL; PyObject *tmp; + PyObject *name; if (h == NULL) { /* Let's get real error message to return */ @@ -4637,7 +4651,10 @@ goto err; } - rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list); + name = sock_decode_hostname(h->h_name); + if (name == NULL) + goto err; + rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list); err: Py_XDECREF(name_list); @@ -5623,6 +5640,7 @@ struct addrinfo hints, *res = NULL; int error; PyObject *ret = (PyObject *)NULL; + PyObject *name; flags = flowinfo = scope_id = 0; if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags)) @@ -5686,7 +5704,11 @@ set_gaierror(error); goto fail; } - ret = Py_BuildValue("ss", hbuf, pbuf); + + name = sock_decode_hostname(hbuf); + if (name == NULL) + goto fail; + ret = Py_BuildValue("Ns", name, pbuf); fail: if (res)