From: Marc Hoersken Date: Wed, 26 Aug 2020 20:13:21 +0000 (+0200) Subject: multi: handle connection state winsock events X-Git-Tag: curl-7_73_0~190 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=003e81e2a3d2e72c2319ef9bd285141fe02e0b26;p=thirdparty%2Fcurl.git multi: handle connection state winsock events Learn from the way Cygwin handles and maps the WinSock events to simulate correct and complete poll and select behaviour according to Richard W. Stevens Network Programming book. Reviewed-by: Jay Satiro Reviewed-by: Marcel Raad Follow up to #5634 Closes #5867 --- diff --git a/lib/multi.c b/lib/multi.c index f4448f7c45..2a91246486 100644 --- a/lib/multi.c +++ b/lib/multi.c @@ -1184,7 +1184,7 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi, #ifdef USE_WINSOCK if(SOCKET_READABLE(sockbunch[i], 0) > 0) timeout_ms = 0; - mask |= FD_READ; + mask |= (FD_READ|FD_ACCEPT|FD_CLOSE); #else ufds[nfds].fd = sockbunch[i]; ufds[nfds].events = POLLIN; @@ -1196,7 +1196,7 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi, #ifdef USE_WINSOCK if(SOCKET_WRITABLE(sockbunch[i], 0) > 0) timeout_ms = 0; - mask |= FD_WRITE; + mask |= (FD_WRITE|FD_CONNECT|FD_CLOSE); #else ufds[nfds].fd = sockbunch[i]; ufds[nfds].events = POLLOUT; @@ -1226,7 +1226,7 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi, pre_poll.events = 0; pre_poll.revents = 0; if(extra_fds[i].events & CURL_WAIT_POLLIN) { - events |= FD_READ; + events |= (FD_READ|FD_ACCEPT|FD_CLOSE); pre_poll.events |= POLLIN; } if(extra_fds[i].events & CURL_WAIT_POLLPRI) { @@ -1234,7 +1234,7 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi, pre_poll.events |= POLLPRI; } if(extra_fds[i].events & CURL_WAIT_POLLOUT) { - events |= FD_WRITE; + events |= (FD_WRITE|FD_CONNECT|FD_CLOSE); pre_poll.events |= POLLOUT; } if(Curl_poll(&pre_poll, 1, 0) > 0) { @@ -1299,9 +1299,9 @@ static CURLMcode Curl_multi_wait(struct Curl_multi *multi, mask = extra_fds[i].revents; if(WSAEnumNetworkEvents(extra_fds[i].fd, multi->wsa_event, &events) == 0) { - if(events.lNetworkEvents & FD_READ) + if(events.lNetworkEvents & (FD_READ|FD_ACCEPT|FD_CLOSE)) mask |= CURL_WAIT_POLLIN; - if(events.lNetworkEvents & FD_WRITE) + if(events.lNetworkEvents & (FD_WRITE|FD_CONNECT|FD_CLOSE)) mask |= CURL_WAIT_POLLOUT; if(events.lNetworkEvents & FD_OOB) mask |= CURL_WAIT_POLLPRI;