dlls/iphlpapi/iphlpapi_main.c:

Peter Balzer Peter535 at hab-verschlafen.de
Fri Nov 19 13:14:56 CST 2010


 - skip IPv6 nameservers instead of interpreting their data as IPv4

---
 dlls/iphlpapi/iphlpapi_main.c |   72 ++++++++++++++++++++++++++++-------------
 1 files changed, 49 insertions(+), 23 deletions(-)

diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c
index 84ed558..1b7bbc0 100644
--- a/dlls/iphlpapi/iphlpapi_main.c
+++ b/dlls/iphlpapi/iphlpapi_main.c
@@ -926,45 +926,71 @@ static ULONG adapterAddressesFromIndex(ULONG family, ULONG flags, DWORD index,
 
 static ULONG get_dns_server_addresses(PIP_ADAPTER_DNS_SERVER_ADDRESS address, ULONG *len)
 {
-    DWORD size;
+    DWORD entrysize, size;
+    int nscount, i;
+
+    if (!len)
+        return ERROR_INVALID_PARAMETER;
 
     initialise_resolver();
+
     /* FIXME: no support for IPv6 DNS server addresses.  Doing so requires
      * sizeof SOCKADDR_STORAGE instead, and using _res._u._ext.nsaddrs when
      * available.
+     *
+     * At least skip IPv6 addresses. Interpreting an IPV6 entry as IPv4 is bad.
      */
-    size = _res.nscount * (sizeof(IP_ADAPTER_DNS_SERVER_ADDRESS) + sizeof(SOCKADDR));
+    entrysize = sizeof(IP_ADAPTER_DNS_SERVER_ADDRESS) + sizeof(SOCKADDR); 
+    nscount = _res.nscount;
+
+    /* TODO: do we have __RES also when we have no resolv.h header file? */
+#if defined(HAVE_RESOLV_H) && (__RES > 19991006)
+    if (_res._u._ext.nscount6)
+        nscount -= _res._u._ext.nscount6;
+#else
+    nscount = 0;
+    for (i = 0; i < _res.nscount; i++)
+        if (_res.nsaddr_list[i].sin_family == AF_INET)
+            nscount++;
+#endif
+
+    size = nscount * entrysize;
     if (!address || *len < size)
     {
         *len = size;
         return ERROR_BUFFER_OVERFLOW;
     }
+
     *len = size;
-    if (_res.nscount > 0)
+    if (nscount > 0)
     {
-        PIP_ADAPTER_DNS_SERVER_ADDRESS addr;
-        int i;
-
-        for (i = 0, addr = address; i < _res.nscount && addr;
-             i++, addr = addr->Next)
+        PIP_ADAPTER_DNS_SERVER_ADDRESS addr = address;
+        int nsi;
+        for (i = 0, nsi = 0; i < _res.nscount && (nsi < nscount); i++)
         {
-            SOCKADDR_IN *sin;
-
-            addr->Address.iSockaddrLength = sizeof(SOCKADDR);
-            addr->Address.lpSockaddr =
-             (LPSOCKADDR)((PBYTE)addr + sizeof(IP_ADAPTER_DNS_SERVER_ADDRESS));
-            sin = (SOCKADDR_IN *)addr->Address.lpSockaddr;
-            sin->sin_family = WS_AF_INET;
-            sin->sin_port = _res.nsaddr_list[i].sin_port;
-            memcpy(&sin->sin_addr, &_res.nsaddr_list[i].sin_addr, sizeof(sin->sin_addr));
-            if (i == _res.nscount - 1)
-                addr->Next = NULL;
-            else
-                addr->Next =
-                 (PIP_ADAPTER_DNS_SERVER_ADDRESS)((PBYTE)addr +
-                 sizeof(IP_ADAPTER_DNS_SERVER_ADDRESS) + sizeof(SOCKADDR));
+            if (_res.nsaddr_list[i].sin_family == AF_INET)
+            {
+                SOCKADDR_IN *sin;
+
+                addr->Address.iSockaddrLength = sizeof(SOCKADDR);
+                addr->Address.lpSockaddr =
+                 (LPSOCKADDR)((PBYTE)addr + sizeof(IP_ADAPTER_DNS_SERVER_ADDRESS));
+                sin = (SOCKADDR_IN *)addr->Address.lpSockaddr;
+                sin->sin_family = WS_AF_INET;
+                sin->sin_port = _res.nsaddr_list[i].sin_port;
+                memcpy(&sin->sin_addr, &_res.nsaddr_list[i].sin_addr, sizeof(sin->sin_addr));
+                addr->Next = (PIP_ADAPTER_DNS_SERVER_ADDRESS)((PBYTE)addr + entrysize);
+                addr = addr->Next;
+                nsi++;
+            }
         }
+
+        addr = (PIP_ADAPTER_DNS_SERVER_ADDRESS)((PBYTE)address + (nsi - 1) * entrysize);
+        addr->Next = NULL;
+        if (i != _res.nscount)
+            FIXME("dropped %i ipv6 nameserver entries, only using %i ipv4 ones.\n", _res.nscount - nsi, nsi);
     }
+
     return ERROR_SUCCESS;
 }
 
-- 
1.7.2.3

-- 
GMX DSL Doppel-Flat ab 19,99 &euro;/mtl.! Jetzt auch mit 
gratis Notebook-Flat! http://portal.gmx.net/de/go/dsl



More information about the wine-patches mailing list