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 €/mtl.! Jetzt auch mit
gratis Notebook-Flat! http://portal.gmx.net/de/go/dsl
More information about the wine-patches
mailing list