aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKamil Dudka <kdudka@redhat.com>2013-09-09 13:10:53 +0200
committerKamil Dudka <kdudka@redhat.com>2013-09-09 13:23:04 +0200
commitc639d725a37c91fb49bb3a689cb2596fad3a0645 (patch)
tree04386f0f88f6cf5a044f5090423be9b900f82436
parent857f999353f333d458f4ebb7de48fed864a4badb (diff)
url: handle abortion by read/write callbacks, too
Otherwise, the FTP protocol would unnecessarily hang 60 seconds if aborted in the CURLOPT_HEADERFUNCTION callback. Reported by: Tomas Mlcoch Bug: https://bugzilla.redhat.com/1005686
-rw-r--r--RELEASE-NOTES2
-rw-r--r--lib/url.c8
2 files changed, 9 insertions, 1 deletions
diff --git a/RELEASE-NOTES b/RELEASE-NOTES
index bae2d93ce..68515c7a6 100644
--- a/RELEASE-NOTES
+++ b/RELEASE-NOTES
@@ -29,6 +29,7 @@ This release includes the following bugfixes:
o TFTP: make the CURLOPT_LOW_SPEED* options work [4]
o curl.h: name space pollution by "enum type" [5]
o multi: move on from STATE_DONE faster [6]
+ o FTP: 60 secs delay if aborted in the CURLOPT_HEADERFUNCTION callback [11]
This release includes the following known bugs:
@@ -55,3 +56,4 @@ References to bug reports and discussions on issues:
[8] = http://curl.haxx.se/bug/view.cgi?id=1267
[9] = http://curl.haxx.se/mail/lib-2013-08/0234.html
[10] = http://curl.haxx.se/mail/lib-2013-08/0136.html
+ [11] = https://bugzilla.redhat.com/1005686
diff --git a/lib/url.c b/lib/url.c
index f6da3ca26..50ce80df4 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -5743,12 +5743,18 @@ CURLcode Curl_done(struct connectdata **connp,
conn->dns_entry = NULL;
}
- if(status == CURLE_ABORTED_BY_CALLBACK)
+ switch(status) {
+ case CURLE_ABORTED_BY_CALLBACK:
+ case CURLE_READ_ERROR:
+ case CURLE_WRITE_ERROR:
/* When we're aborted due to a callback return code it basically have to
be counted as premature as there is trouble ahead if we don't. We have
many callbacks and protocols work differently, we could potentially do
this more fine-grained in the future. */
premature = TRUE;
+ default:
+ break;
+ }
/* this calls the protocol-specific function pointer previously set */
if(conn->handler->done)