From: Hans Leidekker hans@codeweavers.com
--- dlls/wbemprox/builtin.c | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-)
diff --git a/dlls/wbemprox/builtin.c b/dlls/wbemprox/builtin.c index 3703fd0cca5..5f183251752 100644 --- a/dlls/wbemprox/builtin.c +++ b/dlls/wbemprox/builtin.c @@ -2849,26 +2849,36 @@ static WCHAR *get_networkadapter_guid( const IF_LUID *luid ) return guid_to_str( &guid ); }
+static IP_ADAPTER_ADDRESSES *get_network_adapters(void) +{ + ULONG err, size = 4096; + IP_ADAPTER_ADDRESSES *tmp, *ret; + + if (!(ret = malloc( size ))) return NULL; + err = GetAdaptersAddresses( AF_UNSPEC, GAA_FLAG_INCLUDE_GATEWAYS, NULL, ret, &size ); + while (err == ERROR_BUFFER_OVERFLOW) + { + if (!(tmp = realloc( ret, size ))) break; + ret = tmp; + err = GetAdaptersAddresses( AF_UNSPEC, GAA_FLAG_INCLUDE_GATEWAYS, NULL, ret, &size ); + } + if (err == ERROR_SUCCESS) return ret; + free( ret ); + return NULL; +} + static enum fill_status fill_networkadapter( struct table *table, const struct expr *cond ) { WCHAR device_id[11]; struct record_networkadapter *rec; IP_ADAPTER_ADDRESSES *aa, *buffer; UINT row = 0, offset = 0, count = 0; - DWORD size = 0, ret; int adaptertypeid, physical; UINT16 connection_status; enum fill_status status = FILL_STATUS_UNFILTERED;
- ret = GetAdaptersAddresses( AF_UNSPEC, 0, NULL, NULL, &size ); - if (ret != ERROR_BUFFER_OVERFLOW) return FILL_STATUS_FAILED; + if (!(buffer = get_network_adapters())) return FILL_STATUS_FAILED;
- if (!(buffer = malloc( size ))) return FILL_STATUS_FAILED; - if (GetAdaptersAddresses( AF_UNSPEC, 0, NULL, buffer, &size )) - { - free( buffer ); - return FILL_STATUS_FAILED; - } for (aa = buffer; aa; aa = aa->Next) { if (aa->IfType != IF_TYPE_SOFTWARE_LOOPBACK) count++; @@ -3092,18 +3102,10 @@ static enum fill_status fill_networkadapterconfig( struct table *table, const st struct record_networkadapterconfig *rec; IP_ADAPTER_ADDRESSES *aa, *buffer; UINT row = 0, offset = 0, count = 0; - DWORD size = 0, ret; enum fill_status status = FILL_STATUS_UNFILTERED;
- ret = GetAdaptersAddresses( AF_UNSPEC, GAA_FLAG_INCLUDE_GATEWAYS, NULL, NULL, &size ); - if (ret != ERROR_BUFFER_OVERFLOW) return FILL_STATUS_FAILED; + if (!(buffer = get_network_adapters())) return FILL_STATUS_FAILED;
- if (!(buffer = malloc( size ))) return FILL_STATUS_FAILED; - if (GetAdaptersAddresses( AF_UNSPEC, GAA_FLAG_INCLUDE_GATEWAYS, NULL, buffer, &size )) - { - free( buffer ); - return FILL_STATUS_FAILED; - } for (aa = buffer; aa; aa = aa->Next) { if (aa->IfType != IF_TYPE_SOFTWARE_LOOPBACK) count++;
From: Hans Leidekker hans@codeweavers.com
--- 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)
From: Hans Leidekker hans@codeweavers.com
--- 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 )