Skip to content

Commit a058f1a

Browse files
author
Paul Gofman
committed
iphlpapi: Partially fill Ipv4 / Ipv6 metric in GetAdaptersAddresses().
CW-Bug-Id: #23640
1 parent cfd8b61 commit a058f1a

File tree

1 file changed

+14
-7
lines changed

1 file changed

+14
-7
lines changed

dlls/iphlpapi/iphlpapi_main.c

+14-7
Original file line numberDiff line numberDiff line change
@@ -993,6 +993,7 @@ static DWORD gateway_and_prefix_addresses_alloc( IP_ADAPTER_ADDRESSES *aa, ULONG
993993
{
994994
struct nsi_ipv4_forward_key *key4;
995995
struct nsi_ipv6_forward_key *key6;
996+
struct nsi_ip_forward_rw *rw;
996997
IP_ADAPTER_GATEWAY_ADDRESS *gw, **gw_next;
997998
IP_ADAPTER_PREFIX *prefix, **prefix_next;
998999
DWORD err, count, i, prefix_len, key_size = (family == AF_INET) ? sizeof(*key4) : sizeof(*key6);
@@ -1002,11 +1003,14 @@ static DWORD gateway_and_prefix_addresses_alloc( IP_ADAPTER_ADDRESSES *aa, ULONG
10021003
void *key;
10031004

10041005
err = NsiAllocateAndGetTable( 1, ip_module_id( family ), NSI_IP_FORWARD_TABLE, &key, key_size,
1005-
NULL, 0, NULL, 0, NULL, 0, &count, 0 );
1006+
(void **)&rw, sizeof(*rw), NULL, 0, NULL, 0, &count, 0 );
10061007
if (err) return err;
10071008

10081009
while (aa)
10091010
{
1011+
if (family == AF_INET) aa->Ipv4Metric = ~0u;
1012+
else aa->Ipv6Metric = ~0u;
1013+
10101014
for (gw_next = &aa->FirstGatewayAddress; *gw_next; gw_next = &(*gw_next)->Next)
10111015
;
10121016
for (prefix_next = &aa->FirstPrefix; *prefix_next; prefix_next = &(*prefix_next)->Next)
@@ -1019,6 +1023,12 @@ static DWORD gateway_and_prefix_addresses_alloc( IP_ADAPTER_ADDRESSES *aa, ULONG
10191023
luid = (family == AF_INET) ? &key4->luid : &key6->luid;
10201024
if (luid->Value != aa->Luid.Value) continue;
10211025

1026+
if (rw[i].metric)
1027+
{
1028+
if (family == AF_INET) aa->Ipv4Metric = min( aa->Ipv4Metric, rw[i].metric );
1029+
else aa->Ipv6Metric = min( aa->Ipv6Metric, rw[i].metric );
1030+
}
1031+
10221032
if (flags & GAA_FLAG_INCLUDE_ALL_GATEWAYS)
10231033
{
10241034
memset( &sockaddr, 0, sizeof(sockaddr) );
@@ -1103,7 +1113,7 @@ static DWORD gateway_and_prefix_addresses_alloc( IP_ADAPTER_ADDRESSES *aa, ULONG
11031113
}
11041114

11051115
err:
1106-
NsiFreeTable( key, NULL, NULL, NULL );
1116+
NsiFreeTable( key, rw, NULL, NULL );
11071117
return err;
11081118
}
11091119

@@ -1269,11 +1279,8 @@ static DWORD adapters_addresses_alloc( ULONG family, ULONG flags, IP_ADAPTER_ADD
12691279
if (err) goto err;
12701280
}
12711281

1272-
if (flags & (GAA_FLAG_INCLUDE_ALL_GATEWAYS | GAA_FLAG_INCLUDE_PREFIX))
1273-
{
1274-
err = call_families( gateway_and_prefix_addresses_alloc, aa, family, flags );
1275-
if (err) goto err;
1276-
}
1282+
err = call_families( gateway_and_prefix_addresses_alloc, aa, family, flags );
1283+
if (err) goto err;
12771284

12781285
err = dns_info_alloc( aa, family, flags );
12791286
if (err) goto err;

0 commit comments

Comments
 (0)