From d01e619c7b75847aedbd5cf5546bc4c8a10c5efd Mon Sep 17 00:00:00 2001 From: Hans Leidekker Date: Mon, 4 Sep 2023 17:30:30 +0200 Subject: [PATCH] netprofm: Call GetAdaptersAddresses() in a loop. --- dlls/netprofm/list.c | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/dlls/netprofm/list.c b/dlls/netprofm/list.c index e6819185f22..cb65484485b 100644 --- a/dlls/netprofm/list.c +++ b/dlls/netprofm/list.c @@ -1739,26 +1739,34 @@ static struct connection *create_connection( const GUID *id ) return ret; } +static IP_ADAPTER_ADDRESSES *get_network_adapters(void) +{ + ULONG err, size = 4096, flags = GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | + GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_INCLUDE_GATEWAYS; + IP_ADAPTER_ADDRESSES *tmp, *ret; + + if (!(ret = malloc( size ))) return NULL; + err = GetAdaptersAddresses( AF_UNSPEC, flags, NULL, ret, &size ); + while (err == ERROR_BUFFER_OVERFLOW) + { + if (!(tmp = realloc( ret, size ))) break; + ret = tmp; + err = GetAdaptersAddresses( AF_UNSPEC, flags, NULL, ret, &size ); + } + if (err == ERROR_SUCCESS) return ret; + free( ret ); + return NULL; +} + static void init_networks( struct list_manager *mgr ) { - DWORD size = 0; IP_ADAPTER_ADDRESSES *buf, *aa; GUID id; - ULONG ret, flags = GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | - GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_INCLUDE_GATEWAYS; list_init( &mgr->networks ); list_init( &mgr->connections ); - ret = GetAdaptersAddresses( AF_UNSPEC, flags, NULL, NULL, &size ); - if (ret != ERROR_BUFFER_OVERFLOW) return; - - if (!(buf = malloc( size ))) return; - if (GetAdaptersAddresses( AF_UNSPEC, flags, NULL, buf, &size )) - { - free( buf ); - return; - } + if (!(buf = get_network_adapters())) return; memset( &id, 0, sizeof(id) ); for (aa = buf; aa; aa = aa->Next)