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.
This commit is contained in:
Victor Stinner 2016-01-28 15:41:01 +01:00
parent 806cb0f2b6
commit 7240030c52
2 changed files with 28 additions and 2 deletions

View File

@ -66,6 +66,10 @@ Core and Builtins
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.

View File

@ -4519,6 +4519,19 @@ PyDoc_STRVAR(gethostbyname_doc,
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 @@ gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
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 @@ gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
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 @@ socket_getnameinfo(PyObject *self, PyObject *args)
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 @@ socket_getnameinfo(PyObject *self, PyObject *args)
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)