iphlpapi: Set 0.0.0.0 as the IP and mask of disconnected interfaces

Bruno Jesus 00cpxxx at gmail.com
Thu Jan 15 06:13:34 CST 2015


Superseeds 108610.

In Windows if the eth cable is disconnected the interface returns
0.0.0.0, when it's connected and using DHCP but no DHCP server is
found it returns an APIPA [1] address. In our case it's simpler to
assume that an IP less interface is a disconnected interface.

Fixes bug https://bugs.winehq.org/show_bug.cgi?id=32205

[1] http://www.webopedia.com/TERM/A/APIPA.html
-------------- next part --------------
diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c
index 59f3593..d2f36fe 100644
--- a/dlls/iphlpapi/iphlpapi_main.c
+++ b/dlls/iphlpapi/iphlpapi_main.c
@@ -604,6 +604,12 @@ DWORD WINAPI GetAdaptersInfo(PIP_ADAPTER_INFO pAdapterInfo, PULONG pOutBufLen)
                   }
                 }
               }
+              /* If no IP was found it probably means that the interface is not
+               * configured. In this case we have to return a zeroed IP and mask. */
+              if (firstIPAddr) {
+                strcpy(ptr->IpAddressList.IpAddress.String, "0.0.0.0");
+                strcpy(ptr->IpAddressList.IpMask.String, "0.0.0.0");
+              }
               /* Find first router through this interface, which we'll assume
                * is the default gateway for this adapter */
               for (i = 0; i < routeTable->dwNumEntries; i++)
diff --git a/dlls/iphlpapi/tests/iphlpapi.c b/dlls/iphlpapi/tests/iphlpapi.c
index b2d81c0..14bbc5d 100644
--- a/dlls/iphlpapi/tests/iphlpapi.c
+++ b/dlls/iphlpapi/tests/iphlpapi.c
@@ -1118,12 +1118,20 @@ static void testGetAdaptersInfo(void)
     if (apiReturn == ERROR_NO_DATA)
       ; /* no adapter's, that's okay */
     else if (apiReturn == ERROR_BUFFER_OVERFLOW) {
-      PIP_ADAPTER_INFO buf = HeapAlloc(GetProcessHeap(), 0, len);
+      PIP_ADAPTER_INFO ptr, buf = HeapAlloc(GetProcessHeap(), 0, len);
 
       apiReturn = pGetAdaptersInfo(buf, &len);
       ok(apiReturn == NO_ERROR,
        "GetAdaptersInfo(buf, &dwSize) returned %d, expected NO_ERROR\n",
        apiReturn);
+      ptr = buf;
+      while (ptr) {
+        ok(ptr->IpAddressList.IpAddress.String[0], "A valid IP must be present\n");
+        ok(ptr->IpAddressList.IpMask.String[0], "A valid mask must be present\n");
+        trace("Adapter '%s', IP %s, Mask %s\n", ptr->AdapterName,
+              ptr->IpAddressList.IpAddress.String, ptr->IpAddressList.IpMask.String);
+        ptr = ptr->Next;
+      }
       HeapFree(GetProcessHeap(), 0, buf);
     }
   }


More information about the wine-patches mailing list