From 1bfbd250272d019949c89e48bfbeb7cd00d20029 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Tue, 29 Jan 2008 12:58:25 +0000 Subject: [PATCH] - Dmitry Kurochkin fixed Curl_done() for pipelining, as it could previously crash! --- CHANGES | 3 +++ RELEASE-NOTES | 4 ++-- docs/KNOWN_BUGS | 3 --- lib/url.c | 15 ++++++++++----- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/CHANGES b/CHANGES index 6701faae8e..e12d9ed188 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,9 @@ Changelog Daniel S (29 Jan 2008) +- Dmitry Kurochkin fixed Curl_done() for pipelining, as it could previously + crash! + - Michal Marek fixed minor mistake in test case 553 that prevented it from working on other IP-addresses or port numbers. diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 5a9f5848c4..b8eabdb921 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -14,7 +14,7 @@ This release includes the following changes: This release includes the following bugfixes: - o + o improved pipelining This release includes the following known bugs: @@ -31,6 +31,6 @@ New curl mirrors: This release would not have looked like this without help, code, reports and advice from friends like these: - Michal Marek + Michal Marek, Dmitry Kurochkin Thanks! (and sorry if I forgot to mention someone) diff --git a/docs/KNOWN_BUGS b/docs/KNOWN_BUGS index 566592ffdb..c40219bb48 100644 --- a/docs/KNOWN_BUGS +++ b/docs/KNOWN_BUGS @@ -12,9 +12,6 @@ may have been fixed since this was written! wants NTLM and close the connection to the initial CONNECT response: http://curl.haxx.se/bug/view.cgi?id=1879375 -50. Curl_done() and pipelning aren't totally cool together: - http://curl.haxx.se/mail/lib-2008-01/0330.html - 49. If using --retry and the transfer timeouts (possibly due to using -m or -y/-Y) the next attempt doesn't resume the transfer properly from what was downloaded in the previous attempt but will truncate and restart at the diff --git a/lib/url.c b/lib/url.c index 5a47e289aa..4fab64486e 100644 --- a/lib/url.c +++ b/lib/url.c @@ -4414,11 +4414,6 @@ CURLcode Curl_done(struct connectdata **connp, Curl_expire(data, 0); /* stop timer */ - if(conn->bits.done) - return CURLE_OK; /* Curl_done() has already been called */ - - conn->bits.done = TRUE; /* called just now! */ - if(Curl_removeHandleFromPipeline(data, conn->recv_pipe) && conn->readchannel_inuse) conn->readchannel_inuse = FALSE; @@ -4427,6 +4422,16 @@ CURLcode Curl_done(struct connectdata **connp, conn->writechannel_inuse = FALSE; Curl_removeHandleFromPipeline(data, conn->pend_pipe); + if(conn->bits.done || + (conn->send_pipe->size + conn->recv_pipe->size != 0 && + !data->set.reuse_forbid && + !conn->bits.close)) + /* Stop if Curl_done() has already been called or pipeline + is not empty and we do not have to close connection. */ + return CURLE_OK; + + conn->bits.done = TRUE; /* called just now! */ + /* Cleanup possible redirect junk */ if(data->req.newurl) { free(data->req.newurl);