]> granicus.if.org Git - python/commitdiff
Fixed socket_gethostname() on windows.
authorHirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
Fri, 5 Nov 2010 17:24:13 +0000 (17:24 +0000)
committerHirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
Fri, 5 Nov 2010 17:24:13 +0000 (17:24 +0000)
Modules/socketmodule.c

index a1a90f43875cda39b4faefa8646d1ec5efd8ea3e..e24bf546c7d9b783a44f714f2f8e6890399584de 100644 (file)
@@ -3097,17 +3097,20 @@ socket_gethostname(PyObject *self, PyObject *unused)
     /* Don't use winsock's gethostname, as this returns the ANSI
        version of the hostname, whereas we need a Unicode string.
        Otherwise, gethostname apparently also returns the DNS name. */
-    wchar_t buf[MAX_COMPUTERNAME_LENGTH];
-    DWORD size = sizeof(buf);
+    wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
+    DWORD size = sizeof(buf) / sizeof(wchar_t);
+    PyObject *result;
     if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size)) {
         if (GetLastError() == ERROR_MORE_DATA) {
             /* MSDN says this may occur "because DNS allows longer names */
-            PyObject *result = PyUnicode_FromUnicode(NULL, size);
+            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 (GetComputerName(ComputerNamePhysicalDnsHostname,
-                                PyUnicode_AS_UNICODE(result),
-                                size+1))
+            if (GetComputerNameExW(ComputerNamePhysicalDnsHostname,
+                                   PyUnicode_AS_UNICODE(result),
+                                   &size))
                 return result;
             Py_DECREF(result);
         }