pidgin/pidgin

b3ad11cab64e
Parents a66a4f09ea6a
Children 3094e049f882
win32: Allow for arbitrary buffer size used for retrieving NLA responses

Refs #16574
--- a/libpurple/network.c Wed Oct 19 13:00:17 2016 -0400
+++ b/libpurple/network.c Wed Oct 19 13:01:43 2016 -0400
@@ -636,17 +636,29 @@
return -1;
} else {
- char buf[4096];
+ gchar *buf = NULL;
WSAQUERYSET *res = (LPWSAQUERYSET) buf;
- DWORD size = sizeof(buf);
- while ((retval = WSALookupServiceNextA(h, 0, &size, res)) == ERROR_SUCCESS) {
- net_cnt++;
- purple_debug_info("network", "found network '%s'\n",
- res->lpszServiceInstanceName ? res->lpszServiceInstanceName : "(NULL)");
- size = sizeof(buf);
+ DWORD current_size = 0;
+ while (TRUE) {
+ DWORD size = current_size;
+ retval = WSALookupServiceNextA(h, 0, &size, res);
+ if (retval == ERROR_SUCCESS) {
+ net_cnt++;
+ purple_debug_info("network", "found network '%s'\n",
+ res->lpszServiceInstanceName ? res->lpszServiceInstanceName : "(NULL)");
+ } else {
+ errorid = WSAGetLastError();
+ if (errorid == WSAEFAULT) {
+ buf = g_realloc(buf, size);
+ res = (LPWSAQUERYSET) buf;
+ current_size = size;
+ } else {
+ break;
+ }
+ }
}
+ g_free(buf);
- errorid = WSAGetLastError();
if (!(errorid == WSA_E_NO_MORE || errorid == WSAENOMORE)) {
gchar *msg = g_win32_error_message(errorid);
purple_debug_error("network", "got unexpected NLA response %s (%d)\n", msg, errorid);
@@ -700,9 +712,9 @@
WSAQUERYSET qs;
WSAEVENT *nla_event;
time_t last_trigger = time(NULL) - 31;
- char buf[4096];
+ gchar *buf = NULL;
WSAQUERYSET *res = (LPWSAQUERYSET) buf;
- DWORD size;
+ DWORD current_size = 0;
if ((nla_event = WSACreateEvent()) == WSA_INVALID_EVENT) {
int errorid = WSAGetLastError();
@@ -794,13 +806,28 @@
return NULL;
}
- size = sizeof(buf);
- while ((retval = WSALookupServiceNextA(network_change_handle, 0, &size, res)) == ERROR_SUCCESS) {
- /*purple_timeout_add(0, _print_debug_msg,
+ while (TRUE) {
+ DWORD size = current_size;
+ retval = WSALookupServiceNextA(network_change_handle, 0, &size, res);
+ if (retval == ERROR_SUCCESS) {
+ /*purple_timeout_add(0, _print_debug_msg,
g_strdup_printf("thread found network '%s'\n",
res->lpszServiceInstanceName ? res->lpszServiceInstanceName : "(NULL)"));*/
- size = sizeof(buf);
+ } else {
+ int errorid = WSAGetLastError();
+ if (errorid == WSAEFAULT) {
+ buf = g_realloc(buf, size);
+ res = (LPWSAQUERYSET) buf;
+ current_size = size;
+ } else {
+ break;
+ }
+ }
+
}
+ g_free(buf);
+ buf = NULL;
+ current_size = 0;
WSAResetEvent(nla_event);
g_static_mutex_unlock(&mutex);