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:
Daniel Stenberg 2013-07-18 23:36:59 +02:00
parent 6ed2bcc5f5
commit 513e587c5e
1 changed files with 23 additions and 5 deletions

View File

@ -808,7 +808,7 @@ CURLMcode curl_multi_wait(CURLM *multi_handle,
struct Curl_one_easy *easy;
curl_socket_t sockbunch[MAX_SOCKSPEREASYHANDLE];
int bitmap;
unsigned int i, j;
unsigned int i;
unsigned int nfds = 0;
unsigned int curlfds;
struct pollfd *ufds = NULL;
@ -904,15 +904,33 @@ CURLMcode curl_multi_wait(CURLM *multi_handle,
++nfds;
}
if(nfds)
if(nfds) {
/* wait... */
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
i = 0;
for(j = nfds - extra_nfds; j < nfds; j++)
extra_fds[j].revents = ufds[j].revents;
Curl_safefree(ufds);
if(ret)
*ret = i;