aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES3
-rw-r--r--RELEASE-NOTES4
-rw-r--r--docs/KNOWN_BUGS3
-rw-r--r--lib/url.c15
4 files changed, 15 insertions, 10 deletions
diff --git a/CHANGES b/CHANGES
index 6701faae8..e12d9ed18 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 5a9f5848c..b8eabdb92 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 566592ffd..c40219bb4 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 5a47e289a..4fab64486 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);