From 2c27e4ee767c37e1923d26dfc1cddafe31490c2c Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Fri, 3 Dec 2004 09:31:25 +0000 Subject: Bug report #1078066: when a chunked transfer was pre-maturely closed exactly at a chunk boundary it was not considered an error and thus went unnoticed. Added test case 207 to verify. --- CHANGES | 14 +++++++++++++ RELEASE-NOTES | 5 ++++- lib/transfer.c | 15 ++++++++++--- tests/data/Makefile.am | 2 +- tests/data/test207 | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 88 insertions(+), 5 deletions(-) create mode 100644 tests/data/test207 diff --git a/CHANGES b/CHANGES index 982cc0a0e..8ee15e0a4 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,20 @@ Changelog +Daniel (3 December 2004) +- Bug report #1078066: when a chunked transfer was pre-maturely closed exactly + at a chunk boundary it was not considered an error and thus went unnoticed. + + Added test case 207 to verify. + +Daniel (2 December 2004) +- Fixed the CONNECT loop to default timeout to 3600 seconds. + + Added test case 206 that makes CONNECT with Digest. + + Fixed a flaw that prepended "(nil)" to the initial CONNECT rqeuest's user- + agent field. + Daniel (30 November 2004) - Dan Fandrich's fix for libz 1.1 and "extra field" usage in a gzip stream diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 54358a1a5..9b8f9a866 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -23,7 +23,10 @@ This release includes the following changes: This release includes the following bugfixes: - o --disable-epsv when connecting to an IPv6 ftp server + o chunked-encoded transfers could get closed pre-maturely without error + o proxy CONNECT now default timeouts after 3600 seconds + o --disable-epsv and --disable-eprt are ignored when connecting to an IPv6 ftp + server o no more extra progress meter newline output after each Location: followed o HTTP PUT/POST with Digest, NTLM or Negotiate no longer uses HEAD o now gracefully bails out when exceeding FD_SETSIZE file descriptors diff --git a/lib/transfer.c b/lib/transfer.c index 0e443ef01..aeb830716 100644 --- a/lib/transfer.c +++ b/lib/transfer.c @@ -1368,9 +1368,18 @@ CURLcode Curl_readwrite(struct connectdata *conn, conn->size - k->bytecount); return CURLE_PARTIAL_FILE; } - else if(conn->bits.chunk && conn->proto.http->chunk.datasize) { - failf(data, "transfer closed with at least %d bytes remaining", - conn->proto.http->chunk.datasize); + else if(conn->bits.chunk && + (conn->proto.http->chunk.state != CHUNK_STOP)) { + /* + * In chunked mode, return an error if the connection is closed prior to + * the empty (terminiating) chunk is read. + * + * The condition above used to check for + * conn->proto.http->chunk.datasize != 0 which is true after reading + * *any* chunk, not just the empty chunk. + * + */ + failf(data, "transfer closed with outstanding read data remaining"); return CURLE_PARTIAL_FILE; } if(Curl_pgrsUpdate(conn)) diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index 257256ee4..0d66f891b 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -29,7 +29,7 @@ EXTRA_DIST = test1 test108 test117 test127 test20 test27 test34 test46 \ test184 test185 test186 test187 test188 test189 test191 test192 \ test193 test194 test195 test196 test197 test198 test515 test516 \ test517 test518 test210 test211 test212 test220 test221 test222 \ - test223 test224 test206 + test223 test224 test206 test207 # The following tests have been removed from the dist since they no longer # work. We need to fix the test suite's FTPS server first, then bring them diff --git a/tests/data/test207 b/tests/data/test207 new file mode 100644 index 000000000..c151d9a78 --- /dev/null +++ b/tests/data/test207 @@ -0,0 +1,57 @@ +# +# Server-side + + +HTTP/1.1 200 funky chunky! swsclose +Server: fakeit/0.9 fakeitbad/1.0 +Transfer-Encoding: chunked +Connection: mooo + +41 +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + + + +HTTP/1.1 200 funky chunky! swsclose +Server: fakeit/0.9 fakeitbad/1.0 +Transfer-Encoding: chunked +Connection: mooo + +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + + + +# +# Client-side + + +http + + +HTTP GET with chunked Transfer-Encoding closed pre-maturely + + +http://%HOSTIP:%HTTPPORT/207 + + + +# +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +GET /207 HTTP/1.1 +Host: 127.0.0.1:%HTTPPORT +Pragma: no-cache +Accept: */* + + + +# curl: (18) transfer closed with outstanding read data remaining +# 18 == CURLE_PARTIAL_FILE + +18 + + -- cgit v1.2.3