mirror of
https://github.com/moparisthebest/curl
synced 2024-12-22 08:08:50 -05:00
curl_multi_wait: fix revents
Commit 6d30f8ebed
didn't work properly. First, it used the wrong
array index, but this fix also:
1 - only does the copying if indeed there was any activity
2 - makes sure to properly translate between internal and external
bitfields, which are not guaranteed to match
Reported-by: Evgeny Turnaev
This commit is contained in:
parent
6ed2bcc5f5
commit
513e587c5e
28
lib/multi.c
28
lib/multi.c
@ -808,7 +808,7 @@ CURLMcode curl_multi_wait(CURLM *multi_handle,
|
|||||||
struct Curl_one_easy *easy;
|
struct Curl_one_easy *easy;
|
||||||
curl_socket_t sockbunch[MAX_SOCKSPEREASYHANDLE];
|
curl_socket_t sockbunch[MAX_SOCKSPEREASYHANDLE];
|
||||||
int bitmap;
|
int bitmap;
|
||||||
unsigned int i, j;
|
unsigned int i;
|
||||||
unsigned int nfds = 0;
|
unsigned int nfds = 0;
|
||||||
unsigned int curlfds;
|
unsigned int curlfds;
|
||||||
struct pollfd *ufds = NULL;
|
struct pollfd *ufds = NULL;
|
||||||
@ -904,15 +904,33 @@ CURLMcode curl_multi_wait(CURLM *multi_handle,
|
|||||||
++nfds;
|
++nfds;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(nfds)
|
if(nfds) {
|
||||||
/* wait... */
|
/* wait... */
|
||||||
i = Curl_poll(ufds, nfds, timeout_ms);
|
i = Curl_poll(ufds, nfds, timeout_ms);
|
||||||
|
|
||||||
|
if(i) {
|
||||||
|
unsigned int j;
|
||||||
|
/* copy revents results from the poll to the curl_multi_wait poll
|
||||||
|
struct, the bit values of the actual underlying poll() implementation
|
||||||
|
may not be the same as the ones in the public libcurl API! */
|
||||||
|
for(j = 0; j < extra_nfds; j++) {
|
||||||
|
unsigned short mask = 0;
|
||||||
|
unsigned r = ufds[curlfds + j].revents;
|
||||||
|
|
||||||
|
if(r & POLLIN)
|
||||||
|
mask |= CURL_WAIT_POLLIN;
|
||||||
|
if(r & POLLOUT)
|
||||||
|
mask |= CURL_WAIT_POLLOUT;
|
||||||
|
if(r & POLLPRI)
|
||||||
|
mask |= CURL_WAIT_POLLPRI;
|
||||||
|
|
||||||
|
extra_fds[j].revents = mask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
i = 0;
|
i = 0;
|
||||||
|
|
||||||
for(j = nfds - extra_nfds; j < nfds; j++)
|
|
||||||
extra_fds[j].revents = ufds[j].revents;
|
|
||||||
|
|
||||||
Curl_safefree(ufds);
|
Curl_safefree(ufds);
|
||||||
if(ret)
|
if(ret)
|
||||||
*ret = i;
|
*ret = i;
|
||||||
|
Loading…
Reference in New Issue
Block a user