Module: wine Branch: master Commit: 80d629acbd13c160de5af1cd48960265f54de00d URL: https://gitlab.winehq.org/wine/wine/-/commit/80d629acbd13c160de5af1cd4896026...
Author: Hans Leidekker hans@codeweavers.com Date: Mon Sep 4 18:07:24 2023 +0200
wpcap: Call GetAdaptersAddresses() in a loop.
---
dlls/wpcap/wpcap.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-)
diff --git a/dlls/wpcap/wpcap.c b/dlls/wpcap/wpcap.c index f96e7098ae5..b96e940c024 100644 --- a/dlls/wpcap/wpcap.c +++ b/dlls/wpcap/wpcap.c @@ -391,18 +391,21 @@ static void free_devices( struct pcap_interface *devs )
static IP_ADAPTER_ADDRESSES *get_adapters( void ) { - DWORD size = 0; - IP_ADAPTER_ADDRESSES *ret; + ULONG err, size = 4096; + IP_ADAPTER_ADDRESSES *tmp, *ret; ULONG flags = GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_SKIP_DNS_SERVER;
- if (GetAdaptersAddresses( AF_UNSPEC, flags, NULL, NULL, &size ) != ERROR_BUFFER_OVERFLOW) return NULL; if (!(ret = malloc( size ))) return NULL; - if (GetAdaptersAddresses( AF_UNSPEC, flags, NULL, ret, &size )) + err = GetAdaptersAddresses( AF_UNSPEC, flags, NULL, ret, &size ); + while (err == ERROR_BUFFER_OVERFLOW) { - free( ret ); - return NULL; + if (!(tmp = realloc( ret, size ))) break; + ret = tmp; + err = GetAdaptersAddresses( AF_UNSPEC, flags, NULL, ret, &size ); } - return ret; + if (err == ERROR_SUCCESS) return ret; + free( ret ); + return NULL; }
static IP_ADAPTER_ADDRESSES *find_adapter( IP_ADAPTER_ADDRESSES *list, const char *name )