diff Modules/socketmodule.c @ 65981:49b0d423023e

Fixed socket_gethostname() on windows.
author Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
date Fri, 05 Nov 2010 17:24:13 +0000
parents 2c2eced635f6
children 3d9a86b8cc98
line wrap: on
line diff
--- a/Modules/socketmodule.c	Fri Nov 05 17:23:41 2010 +0000
+++ b/Modules/socketmodule.c	Fri Nov 05 17:24:13 2010 +0000
@@ -3097,17 +3097,20 @@
     /* 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);
         }