Module: wine Branch: master Commit: 986732a5bafa661ef8746a13b3ac84f7a2ddd000 URL: https://gitlab.winehq.org/wine/wine/-/commit/986732a5bafa661ef8746a13b3ac84f...
Author: Hans Leidekker hans@codeweavers.com Date: Tue Sep 5 10:42:25 2023 +0200
wsdapi: Call GetAdaptersAddresses() in a loop.
---
dlls/wsdapi/network.c | 89 ++++++++++++++++----------------------------------- 1 file changed, 27 insertions(+), 62 deletions(-)
diff --git a/dlls/wsdapi/network.c b/dlls/wsdapi/network.c index a17aa8daa79..97573c57919 100644 --- a/dlls/wsdapi/network.c +++ b/dlls/wsdapi/network.c @@ -97,44 +97,37 @@ static DWORD WINAPI sending_thread(LPVOID lpParam) return 0; }
+static IP_ADAPTER_ADDRESSES *get_adapters(ULONG family) +{ + ULONG err, size = 4096; + IP_ADAPTER_ADDRESSES *tmp, *ret; + + if (!(ret = malloc( size ))) return NULL; + err = GetAdaptersAddresses( family, 0, NULL, ret, &size ); + while (err == ERROR_BUFFER_OVERFLOW) + { + if (!(tmp = realloc( ret, size ))) break; + ret = tmp; + err = GetAdaptersAddresses( family, 0, NULL, ret, &size ); + } + if (err == ERROR_SUCCESS) return ret; + free( ret ); + return NULL; +} + static BOOL send_udp_multicast_of_type(char *data, int length, int max_initial_delay, ULONG family) { - IP_ADAPTER_ADDRESSES *adapter_addresses = NULL, *adapter_addr; + IP_ADAPTER_ADDRESSES *adapter_addresses, *adapter_addr; static const struct in6_addr i_addr_zero; sending_thread_params *send_params; - ULONG bufferSize = 0; LPSOCKADDR sockaddr; - BOOL ret = FALSE; HANDLE thread_handle; const char ttl = 8; - ULONG retval; SOCKET s;
- /* Get size of buffer for adapters */ - retval = GetAdaptersAddresses(family, 0, NULL, NULL, &bufferSize); - - if (retval != ERROR_BUFFER_OVERFLOW) - { - WARN("GetAdaptorsAddresses failed with error %08lx\n", retval); - goto cleanup; - } - - adapter_addresses = malloc(bufferSize); - - if (adapter_addresses == NULL) - { - WARN("Out of memory allocating space for adapter information\n"); - goto cleanup; - } - - /* Get list of adapters */ - retval = GetAdaptersAddresses(family, 0, NULL, adapter_addresses, &bufferSize); - - if (retval != ERROR_SUCCESS) - { - WARN("GetAdaptorsAddresses failed with error %08lx\n", retval); - goto cleanup; - } + adapter_addresses = get_adapters(family); + if (!adapter_addresses) + return FALSE;
for (adapter_addr = adapter_addresses; adapter_addr != NULL; adapter_addr = adapter_addr->Next) { @@ -211,12 +204,8 @@ static BOOL send_udp_multicast_of_type(char *data, int length, int max_initial_d CloseHandle(thread_handle); }
- ret = TRUE; - -cleanup: free(adapter_addresses); - - return ret; + return TRUE; }
BOOL send_udp_multicast(IWSDiscoveryPublisherImpl *impl, char *data, int length, int max_initial_delay) @@ -504,36 +493,12 @@ cleanup:
static BOOL start_listening_on_all_addresses(IWSDiscoveryPublisherImpl *impl, ULONG family) { - IP_ADAPTER_ADDRESSES *adapter_addresses = NULL, *adapter_address; + IP_ADAPTER_ADDRESSES *adapter_addresses, *adapter_address; int valid_listeners = 0; - ULONG bufferSize = 0; - ULONG ret; - - ret = GetAdaptersAddresses(family, 0, NULL, NULL, &bufferSize); /* family should be AF_INET or AF_INET6 */
- if (ret != ERROR_BUFFER_OVERFLOW) - { - WARN("GetAdaptorsAddresses failed with error %08lx\n", ret); + adapter_addresses = get_adapters(family); /* family should be AF_INET or AF_INET6 */ + if (!adapter_addresses) return FALSE; - } - - /* Get size of buffer for adapters */ - adapter_addresses = malloc(bufferSize); - - if (adapter_addresses == NULL) - { - WARN("Out of memory allocating space for adapter information\n"); - return FALSE; - } - - /* Get list of adapters */ - ret = GetAdaptersAddresses(family, 0, NULL, adapter_addresses, &bufferSize); - - if (ret != ERROR_SUCCESS) - { - WARN("GetAdaptorsAddresses failed with error %08lx\n", ret); - goto cleanup; - }
for (adapter_address = adapter_addresses; adapter_address != NULL; adapter_address = adapter_address->Next) { @@ -554,7 +519,7 @@ static BOOL start_listening_on_all_addresses(IWSDiscoveryPublisherImpl *impl, UL
cleanup: free(adapter_addresses); - return (ret == ERROR_SUCCESS) && (valid_listeners > 0); + return valid_listeners > 0; }
HRESULT send_udp_unicast(char *data, int length, IWSDUdpAddress *remote_addr, int max_initial_delay)