Huw Davies : iphlpapi: Mark non-loopback, non-linklocal addresses as dns eligible.

Alexandre Julliard julliard at winehq.org
Mon Aug 9 16:21:42 CDT 2021


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

Author: Huw Davies <huw at codeweavers.com>
Date:   Mon Aug  9 10:06:27 2021 +0100

iphlpapi: Mark non-loopback, non-linklocal addresses as dns eligible.

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

---

 dlls/iphlpapi/iphlpapi_main.c | 35 +++++++++++++++++++++++++++++++++--
 1 file changed, 33 insertions(+), 2 deletions(-)

diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c
index dbe4a12afe8..22e17e06757 100644
--- a/dlls/iphlpapi/iphlpapi_main.c
+++ b/dlls/iphlpapi/iphlpapi_main.c
@@ -1036,6 +1036,37 @@ static PMIB_IPFORWARDROW findIPv4Gateway(DWORD index,
     return row;
 }
 
+static BOOL sockaddr_is_loopback( SOCKADDR *sock )
+{
+    if (sock->sa_family == WS_AF_INET)
+    {
+        SOCKADDR_IN *sin = (SOCKADDR_IN *)sock;
+        return (sin->sin_addr.WS_s_addr & 0xff) == 127;
+    }
+    else if (sock->sa_family == WS_AF_INET6)
+    {
+        SOCKADDR_IN6 *sin6 = (SOCKADDR_IN6 *)sock;
+        return WS_IN6_IS_ADDR_LOOPBACK( &sin6->sin6_addr );
+    }
+    return FALSE;
+}
+
+static BOOL sockaddr_is_linklocal( SOCKADDR *sock )
+{
+    if (sock->sa_family == WS_AF_INET6)
+    {
+        SOCKADDR_IN6 *sin6 = (SOCKADDR_IN6 *)sock;
+        return WS_IN6_IS_ADDR_LINKLOCAL( &sin6->sin6_addr );
+    }
+    return FALSE;
+}
+
+static BOOL unicast_is_dns_eligible( IP_ADAPTER_UNICAST_ADDRESS *uni )
+{
+    return !sockaddr_is_loopback( uni->Address.lpSockaddr ) &&
+        !sockaddr_is_linklocal( uni->Address.lpSockaddr );
+}
+
 static void fill_unicast_addr_data(IP_ADAPTER_ADDRESSES *aa, IP_ADAPTER_UNICAST_ADDRESS *ua)
 {
     /* Actually this information should be read somewhere from the system
@@ -1059,6 +1090,8 @@ static void fill_unicast_addr_data(IP_ADAPTER_ADDRESSES *aa, IP_ADAPTER_UNICAST_
     ua->ValidLifetime = 60000;
     ua->PreferredLifetime = 60000;
     ua->LeaseLifetime = 60000;
+
+    if (unicast_is_dns_eligible( ua )) ua->u.s.Flags |= IP_ADAPTER_ADDRESS_DNS_ELIGIBLE;
 }
 
 static ULONG adapterAddressesFromIndex(ULONG family, ULONG flags, IF_INDEX index,
@@ -1186,8 +1219,6 @@ static ULONG adapterAddressesFromIndex(ULONG family, ULONG flags, IF_INDEX index
                 ua->u.s.Length              = sizeof(IP_ADAPTER_UNICAST_ADDRESS);
                 ua->Address.iSockaddrLength = sizeof(struct sockaddr_in);
                 ua->Address.lpSockaddr      = (SOCKADDR *)(ua + 1);
-                if (num_v4_gateways)
-                    ua->u.s.Flags |= IP_ADAPTER_ADDRESS_DNS_ELIGIBLE;
 
                 sa = (struct WS_sockaddr_in *)ua->Address.lpSockaddr;
                 sa->sin_family           = WS_AF_INET;




More information about the wine-cvs mailing list