diff options
author | Daniel Stenberg <daniel@haxx.se> | 2011-10-02 19:28:39 +0200 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2011-10-02 19:28:39 +0200 |
commit | 9dd85bced56f6951107f69e581c872c1e7e3e58e (patch) | |
tree | ad4e006e3571bcdb150a50e396aa3ed3454ced9e /lib/multi.c | |
parent | 5d45285cf39c27135542edcbbadc71c1bd3d90ab (diff) | |
download | curl-9dd85bced56f6951107f69e581c872c1e7e3e58e.tar.gz |
multi: progress function abort must close connection
When the progress function returns to cancel the request, we must mark
the connection to get closed and it must do to the DONE state.
do_init() must be called as early as possible so that state variables
for new connections are reset early. We could otherwise see that the old
values were still there when a connection was to be disconnected very
early and it would make it behave wrongly.
Bug: http://curl.haxx.se/mail/lib-2011-10/0006.html
Reported by: Vladimir Grishchenko
Diffstat (limited to 'lib/multi.c')
-rw-r--r-- | lib/multi.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/lib/multi.c b/lib/multi.c index d2c94590e..bf1f46764 100644 --- a/lib/multi.c +++ b/lib/multi.c @@ -1657,8 +1657,14 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, } /* if there's still a connection to use, call the progress function */ else if(easy->easy_conn && Curl_pgrsUpdate(easy->easy_conn)) { - easy->result = CURLE_ABORTED_BY_CALLBACK; - multistate(easy, CURLM_STATE_COMPLETED); + /* aborted due to progress callback return code must close the + connection */ + easy->easy_conn->bits.close = TRUE; + + /* if not yet in DONE state, go there, otherwise COMPLETED */ + multistate(easy, (easy->state < CURLM_STATE_DONE)? + CURLM_STATE_DONE: CURLM_STATE_COMPLETED); + result = CURLM_CALL_MULTI_PERFORM; } } } WHILE_FALSE; /* just to break out from! */ |