From: Victor Stinner Date: Thu, 17 Nov 2011 00:11:36 +0000 (+0100) Subject: socket_gethostname() uses a wchar_t* with PyMem_Malloc() to avoid the X-Git-Tag: v3.3.0a1~822 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=74168975cc9489e5f726d804cf51f36fd7e0a510;p=python socket_gethostname() uses a wchar_t* with PyMem_Malloc() to avoid the old Unicode API. --- diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 240feb74e1..4742b44b7b 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -3896,24 +3896,34 @@ socket_gethostname(PyObject *self, PyObject *unused) Otherwise, gethostname apparently also returns the DNS name. */ wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1]; DWORD size = Py_ARRAY_LENGTH(buf); + wchar_t *name; PyObject *result; - if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size)) { - if (GetLastError() == ERROR_MORE_DATA) { - /* MSDN says this may occur "because DNS allows longer names */ - if (size == 0) /* XXX: I'm not sure how to handle this */ - return PyUnicode_FromUnicode(NULL, 0); - result = PyUnicode_FromUnicode(NULL, size - 1); - if (!result) - return NULL; - if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, - PyUnicode_AS_UNICODE(result), - &size)) - return result; - Py_DECREF(result); - } - return PyErr_SetExcFromWindowsErr(PyExc_WindowsError, GetLastError()); + + if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size)) + return PyUnicode_FromUnicode(buf, size); + + if (GetLastError() != ERROR_MORE_DATA) + return PyErr_SetFromWindowsErr(0); + + if (size == 0) + return PyUnicode_New(0, 0); + + /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer + names */ + name = PyMem_Malloc(size * sizeof(wchar_t)); + if (!name) + return NULL; + if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname, + name, + &size)) + { + PyMem_Free(name); + return PyErr_SetFromWindowsErr(0); } - return PyUnicode_FromUnicode(buf, size); + + result = PyUnicode_FromWideChar(name, size); + PyMem_Free(name); + return result; #else char buf[1024]; int res;