diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2016-01-28 14:41:01 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2016-01-28 14:41:01 (GMT) |
commit | 7240030c52b5b738830c538bf849da8241c569d0 (patch) | |
tree | 4a547608abf911a0850ad43a4865a57a89a00241 /Modules | |
parent | 806cb0f2b69bc6663e2c248afeadcea54c99d377 (diff) | |
download | cpython-7240030c52b5b738830c538bf849da8241c569d0.zip cpython-7240030c52b5b738830c538bf849da8241c569d0.tar.gz cpython-7240030c52b5b738830c538bf849da8241c569d0.tar.bz2 |
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.
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/socketmodule.c | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index bae9634..90aa3af 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -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) |