diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/server/sockfilt.c | 78 |
1 files changed, 28 insertions, 50 deletions
diff --git a/tests/server/sockfilt.c b/tests/server/sockfilt.c index ab4b080b4..c32cf05c6 100644 --- a/tests/server/sockfilt.c +++ b/tests/server/sockfilt.c @@ -666,15 +666,22 @@ static HANDLE select_ws_wait(HANDLE handle, HANDLE event) return thread; } +struct select_ws_data { + curl_socket_t fd; /* the original input handle (indexed by fds) */ + curl_socket_t wsasock; /* the internal socket handle (indexed by wsa) */ + WSAEVENT wsaevent; /* the internal WINSOCK2 event (indexed by wsa) */ + HANDLE thread; /* the internal threads handle (indexed by thd) */ +}; static int select_ws(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) { DWORD milliseconds, wait, idx; - WSAEVENT wsaevent, *wsaevents; WSANETWORKEVENTS wsanetevents; - HANDLE handle, *handles, *threads; - curl_socket_t sock, *fdarr, *wsasocks; + struct select_ws_data *data; + HANDLE handle, *handles; + curl_socket_t sock; long networkevents; + WSAEVENT wsaevent; int error, fds; HANDLE waitevent = NULL; DWORD nfd = 0, thd = 0, wsa = 0; @@ -699,9 +706,9 @@ static int select_ws(int nfds, fd_set *readfds, fd_set *writefds, return -1; } - /* allocate internal array for the original input handles */ - fdarr = malloc(nfds * sizeof(curl_socket_t)); - if(fdarr == NULL) { + /* allocate internal array for the internal data */ + data = malloc(nfds * sizeof(struct select_ws_data)); + if(data == NULL) { errno = ENOMEM; return -1; } @@ -709,40 +716,14 @@ static int select_ws(int nfds, fd_set *readfds, fd_set *writefds, /* allocate internal array for the internal event handles */ handles = malloc(nfds * sizeof(HANDLE)); if(handles == NULL) { - free(fdarr); - errno = ENOMEM; - return -1; - } - - /* allocate internal array for the internal threads handles */ - threads = malloc(nfds * sizeof(HANDLE)); - if(threads == NULL) { - free(handles); - free(fdarr); - errno = ENOMEM; - return -1; - } - - /* allocate internal array for the internal socket handles */ - wsasocks = malloc(nfds * sizeof(curl_socket_t)); - if(wsasocks == NULL) { - free(threads); - free(handles); - free(fdarr); + free(data); errno = ENOMEM; return -1; } - /* allocate internal array for the internal WINSOCK2 events */ - wsaevents = malloc(nfds * sizeof(WSAEVENT)); - if(wsaevents == NULL) { - free(threads); - free(wsasocks); - free(handles); - free(fdarr); - errno = ENOMEM; - return -1; - } + /* clear internal arrays */ + memset(data, 0, nfds * sizeof(struct select_ws_data)); + memset(handles, 0, nfds * sizeof(HANDLE)); /* loop over the handles in the input descriptor sets */ for(fds = 0; fds < nfds; fds++) { @@ -760,12 +741,12 @@ static int select_ws(int nfds, fd_set *readfds, fd_set *writefds, /* only wait for events for which we actually care */ if(networkevents) { - fdarr[nfd] = curlx_sitosk(fds); + data[nfd].fd = curlx_sitosk(fds); if(fds == fileno(stdin)) { handle = GetStdHandle(STD_INPUT_HANDLE); handle = select_ws_wait(handle, waitevent); handles[nfd] = handle; - threads[thd] = handle; + data[thd].thread = handle; thd++; } else if(fds == fileno(stdout)) { @@ -781,8 +762,8 @@ static int select_ws(int nfds, fd_set *readfds, fd_set *writefds, if(error != SOCKET_ERROR) { handle = (HANDLE) wsaevent; handles[nfd] = handle; - wsasocks[wsa] = curlx_sitosk(fds); - wsaevents[wsa] = wsaevent; + data[wsa].wsasock = curlx_sitosk(fds); + data[wsa].wsaevent = wsaevent; wsa++; } else { @@ -790,7 +771,7 @@ static int select_ws(int nfds, fd_set *readfds, fd_set *writefds, handle = (HANDLE) curlx_sitosk(fds); handle = select_ws_wait(handle, waitevent); handles[nfd] = handle; - threads[thd] = handle; + data[thd].thread = handle; thd++; } } @@ -816,7 +797,7 @@ static int select_ws(int nfds, fd_set *readfds, fd_set *writefds, /* loop over the internal handles returned in the descriptors */ for(idx = 0; idx < nfd; idx++) { handle = handles[idx]; - sock = fdarr[idx]; + sock = data[idx].fd; fds = curlx_sktosi(sock); /* check if the current internal handle was triggered */ @@ -876,22 +857,19 @@ static int select_ws(int nfds, fd_set *readfds, fd_set *writefds, } for(idx = 0; idx < wsa; idx++) { - WSAEventSelect(wsasocks[idx], NULL, 0); - WSACloseEvent(wsaevents[idx]); + WSAEventSelect(data[idx].wsasock, NULL, 0); + WSACloseEvent(data[idx].wsaevent); } for(idx = 0; idx < thd; idx++) { - WaitForSingleObject(threads[thd], INFINITE); - CloseHandle(threads[thd]); + WaitForSingleObject(data[idx].thread, INFINITE); + CloseHandle(data[idx].thread); } CloseHandle(waitevent); - free(wsaevents); - free(wsasocks); - free(threads); free(handles); - free(fdarr); + free(data); return ret; } |