diff options
author | Daniel Stenberg <daniel@haxx.se> | 2011-04-02 23:44:11 +0200 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2011-04-02 23:44:11 +0200 |
commit | c2459c4328e14b40b4274f74f8ee60bf7a231f84 (patch) | |
tree | 23b014755b6c4dbc948cb2c04c9ae33d219243c1 | |
parent | c37ad9e909aa700394d2d38797d3043f537f64e6 (diff) |
multi: conn goes bad when data change
Within multi_socket when conn is used as a shorthand, data could be
changed and multi_runsingle could modify the connectdata struct to deal
with. This bug has not been included in a public release.
Using 'conn' like that turned out to be ugly. This change is a partial
revert of commit f1c6cd42f474df59.
Reported by: Miroslav Spousta
Bug: http://curl.haxx.se/bug/view.cgi?id=3265485
-rw-r--r-- | lib/multi.c | 26 |
1 files changed, 11 insertions, 15 deletions
diff --git a/lib/multi.c b/lib/multi.c index 8172d061d..82453f848 100644 --- a/lib/multi.c +++ b/lib/multi.c @@ -2105,41 +2105,37 @@ static CURLMcode multi_socket(struct Curl_multi *multi, and just move on. */ ; else { - struct connectdata *conn; data = entry->easy; if(data->magic != CURLEASY_MAGIC_NUMBER) /* bad bad bad bad bad bad bad */ return CURLM_INTERNAL_ERROR; - /* note that this can possibly be NULL at this point */ - conn = data->set.one_easy->easy_conn; - /* If the pipeline is enabled, take the handle which is in the head of the pipeline. If we should write into the socket, take the send_pipe head. If we should read from the socket, take the recv_pipe head. */ - if(conn) { + if(data->set.one_easy->easy_conn) { if ((ev_bitmask & CURL_POLL_OUT) && - conn->send_pipe && - conn->send_pipe->head) - data = conn->send_pipe->head->ptr; + data->set.one_easy->easy_conn->send_pipe && + data->set.one_easy->easy_conn->send_pipe->head) + data = data->set.one_easy->easy_conn->send_pipe->head->ptr; else if ((ev_bitmask & CURL_POLL_IN) && - conn->recv_pipe && - conn->recv_pipe->head) - data = conn->recv_pipe->head->ptr; + data->set.one_easy->easy_conn->recv_pipe && + data->set.one_easy->easy_conn->recv_pipe->head) + data = data->set.one_easy->easy_conn->recv_pipe->head->ptr; } - if(conn && !(conn->handler->flags & PROTOPT_DIRLOCK)) + if(data->set.one_easy->easy_conn && !(data->set.one_easy->easy_conn->handler->flags & PROTOPT_DIRLOCK)) /* set socket event bitmask if they're not locked */ - conn->cselect_bits = ev_bitmask; + data->set.one_easy->easy_conn->cselect_bits = ev_bitmask; do result = multi_runsingle(multi, now, data->set.one_easy); while (CURLM_CALL_MULTI_PERFORM == result); - if(conn && !(conn->handler->flags & PROTOPT_DIRLOCK)) + if(data->set.one_easy->easy_conn && !(data->set.one_easy->easy_conn->handler->flags & PROTOPT_DIRLOCK)) /* clear the bitmask only if not locked */ - conn->cselect_bits = 0; + data->set.one_easy->easy_conn->cselect_bits = 0; if(CURLM_OK >= result) /* get the socket(s) and check if the state has been changed since |