Huw Davies : iphlpapi: Move the loopback check to get_dns_server_list().

Alexandre Julliard julliard at winehq.org
Fri Aug 6 16:10:39 CDT 2021


Module: wine
Branch: master
Commit: 131307746d83ba8ad855b2fd7af9ec1bb48316d1
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=131307746d83ba8ad855b2fd7af9ec1bb48316d1

Author: Huw Davies <huw at codeweavers.com>
Date:   Thu Aug  5 09:56:45 2021 +0100

iphlpapi: Move the loopback check to get_dns_server_list().

Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/iphlpapi/iphlpapi_main.c  | 55 ++++++++++++++++++++----------------------
 dlls/iphlpapi/tests/iphlpapi.c |  4 ---
 2 files changed, 26 insertions(+), 33 deletions(-)

diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c
index 13b5fa4f742..a790d3339ac 100644
--- a/dlls/iphlpapi/iphlpapi_main.c
+++ b/dlls/iphlpapi/iphlpapi_main.c
@@ -2343,13 +2343,15 @@ DWORD WINAPI GetIpNetTable(PMIB_IPNETTABLE pIpNetTable, PULONG pdwSize, BOOL bOr
  * Returns ERROR_BUFFER_OVERFLOW if *len is insufficient,
  * ERROR_SUCCESS otherwise.
  */
-static DWORD get_dns_server_list( IP_ADDR_STRING *list, IP_ADDR_STRING *second, DWORD *len )
+static DWORD get_dns_server_list( const NET_LUID *luid, IP_ADDR_STRING *list, IP_ADDR_STRING *second, DWORD *len )
 {
     char buf[FIELD_OFFSET(IP4_ARRAY, AddrArray[3])];
     IP4_ARRAY *servers = (IP4_ARRAY *)buf;
     DWORD needed, num, err, i, array_len = sizeof(buf);
     IP_ADDR_STRING *ptr;
 
+    if (luid && luid->Info.IfType == MIB_IF_TYPE_LOOPBACK) return ERROR_NO_DATA;
+
     for (;;)
     {
         err = DnsQueryConfig( DnsConfigDnsServerList, 0, NULL, NULL, servers, &array_len );
@@ -2415,7 +2417,7 @@ DWORD WINAPI GetNetworkParams(PFIXED_INFO pFixedInfo, PULONG pOutBufLen)
   if (!pOutBufLen)
     return ERROR_INVALID_PARAMETER;
 
-  get_dns_server_list(NULL, NULL, &serverListSize);
+  get_dns_server_list( NULL, NULL, NULL, &serverListSize );
   size = sizeof(FIXED_INFO) + serverListSize - sizeof(IP_ADDR_STRING);
   if (!pFixedInfo || *pOutBufLen < size) {
     *pOutBufLen = size;
@@ -2427,9 +2429,8 @@ DWORD WINAPI GetNetworkParams(PFIXED_INFO pFixedInfo, PULONG pOutBufLen)
   GetComputerNameExA(ComputerNameDnsHostname, pFixedInfo->HostName, &size);
   size = sizeof(pFixedInfo->DomainName);
   GetComputerNameExA(ComputerNameDnsDomain, pFixedInfo->DomainName, &size);
-  get_dns_server_list(&pFixedInfo->DnsServerList,
-   (PIP_ADDR_STRING)((BYTE *)pFixedInfo + sizeof(FIXED_INFO)),
-   &serverListSize);
+  get_dns_server_list( NULL, &pFixedInfo->DnsServerList, (IP_ADDR_STRING *)(pFixedInfo + 1),
+                       &serverListSize );
   /* Assume the first DNS server in the list is the "current" DNS server: */
   pFixedInfo->CurrentDnsServer = &pFixedInfo->DnsServerList;
   pFixedInfo->NodeType = HYBRID_NODETYPE;
@@ -2493,35 +2494,31 @@ DWORD WINAPI GetNumberOfInterfaces( DWORD *count )
  *  Success: NO_ERROR
  *  Failure: error code from winerror.h
  */
-DWORD WINAPI GetPerAdapterInfo(ULONG IfIndex, PIP_PER_ADAPTER_INFO pPerAdapterInfo, PULONG pOutBufLen)
+DWORD WINAPI GetPerAdapterInfo( ULONG index, IP_PER_ADAPTER_INFO *info, ULONG *size )
 {
-  ULONG bytesNeeded = sizeof(IP_PER_ADAPTER_INFO), serverListSize = 0;
-  DWORD ret = NO_ERROR;
+    DWORD needed = sizeof(*info), dns_size;
+    NET_LUID luid;
 
-  TRACE("(IfIndex %d, pPerAdapterInfo %p, pOutBufLen %p)\n", IfIndex, pPerAdapterInfo, pOutBufLen);
+    TRACE( "(index %d, info %p, size %p)\n", index, info, size );
 
-  if (!pOutBufLen) return ERROR_INVALID_PARAMETER;
+    if (!size) return ERROR_INVALID_PARAMETER;
+    if (ConvertInterfaceIndexToLuid( index, &luid )) return ERROR_NO_DATA;
 
-  if (!isIfIndexLoopback(IfIndex)) {
-    get_dns_server_list(NULL, NULL, &serverListSize);
-    if (serverListSize > sizeof(IP_ADDR_STRING))
-      bytesNeeded += serverListSize - sizeof(IP_ADDR_STRING);
-  }
-  if (!pPerAdapterInfo || *pOutBufLen < bytesNeeded)
-  {
-    *pOutBufLen = bytesNeeded;
-    return ERROR_BUFFER_OVERFLOW;
-  }
+    if (get_dns_server_list( &luid, NULL, NULL, &dns_size ) == ERROR_BUFFER_OVERFLOW)
+        needed += dns_size - sizeof(IP_ADDR_STRING);
 
-  memset(pPerAdapterInfo, 0, bytesNeeded);
-  if (!isIfIndexLoopback(IfIndex)) {
-    ret = get_dns_server_list(&pPerAdapterInfo->DnsServerList,
-     (PIP_ADDR_STRING)((PBYTE)pPerAdapterInfo + sizeof(IP_PER_ADAPTER_INFO)),
-     &serverListSize);
-    /* Assume the first DNS server in the list is the "current" DNS server: */
-    pPerAdapterInfo->CurrentDnsServer = &pPerAdapterInfo->DnsServerList;
-  }
-  return ret;
+    if (!info || *size < needed)
+    {
+        *size = needed;
+        return ERROR_BUFFER_OVERFLOW;
+    }
+
+    memset( info, 0, needed );
+    get_dns_server_list( &luid, &info->DnsServerList, (IP_ADDR_STRING *)(info + 1), &dns_size );
+    info->CurrentDnsServer = &info->DnsServerList;
+
+    /* FIXME Autoconfig: get unicast addresses and compare to 169.254.x.x */
+    return ERROR_SUCCESS;
 }
 
 
diff --git a/dlls/iphlpapi/tests/iphlpapi.c b/dlls/iphlpapi/tests/iphlpapi.c
index e5a9994fbd5..d439f71069b 100644
--- a/dlls/iphlpapi/tests/iphlpapi.c
+++ b/dlls/iphlpapi/tests/iphlpapi.c
@@ -1213,10 +1213,6 @@ static void testGetPerAdapterInfo(void)
     void *buffer;
 
     ret = GetPerAdapterInfo(1, NULL, NULL);
-    if (ret == ERROR_NOT_SUPPORTED) {
-      skip("GetPerAdapterInfo is not supported\n");
-      return;
-    }
     ok( ret == ERROR_INVALID_PARAMETER, "got %u instead of ERROR_INVALID_PARAMETER\n", ret );
     needed = 0xdeadbeef;
     ret = GetPerAdapterInfo(1, NULL, &needed);




More information about the wine-cvs mailing list