Commit 89ab5f43 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

Robson Braga Araujo reported bug #1618359

(http://curl.haxx.se/bug/view.cgi?id=1618359) and subsequently provided a
patch for it: when downloading 2 zero byte files in a row, curl 7.16.0
enters an infinite loop, while curl 7.16.1-20061218 does one additional
unnecessary request.

Fix: During the "Major overhaul introducing http pipelining support and
shared connection cache within the multi handle." change, headerbytecount
was moved to live in the Curl_transfer_keeper structure. But that structure
is reset in the Transfer method, losing the information that we had about
the header size. This patch moves it back to the connectdata struct.
parent 439b84c7
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -6,6 +6,19 @@

                                  Changelog

Daniel (21 December 2006)
- Robson Braga Araujo reported bug #1618359
  (http://curl.haxx.se/bug/view.cgi?id=1618359) and subsequently provided a
  patch for it: when downloading 2 zero byte files in a row, curl 7.16.0
  enters an infinite loop, while curl 7.16.1-20061218 does one additional
  unnecessary request.

  Fix: During the "Major overhaul introducing http pipelining support and
  shared connection cache within the multi handle." change, headerbytecount
  was moved to live in the Curl_transfer_keeper structure. But that structure
  is reset in the Transfer method, losing the information that we had about
  the header size. This patch moves it back to the connectdata struct.

Daniel (16 December 2006)
- Brendan Jurd provided a fix that now prevents libcurl from getting a SIGPIPE
  during certain conditions when GnuTLS is used.
+3 −1
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ This release includes the following bugfixes:
 o getting FTP response code errors when using the multi-interface caused
   libcurl to leak memory
 o no more SIGPIPE when GnuTLS is used
 o FTP downloading 2 zero byte files in a row

Other curl-related news:

@@ -54,6 +55,7 @@ advice from friends like these:
 James Housley, Olaf Stueben, Yang Tse, Gisle Vanem, Bradford Bruce,
 Ciprian Badescu, Dmitriy Sergeyev, Nir Soffer, Venkat Akella, Toon Verwaest,
 Matt Witherspoon, Alexey Simak, Martin Skinner, Sh Diao, Jared Lundell,
 Stefan Krause, Sebastien Willemijns, Alexey Simak, Brendan Jurd
 Stefan Krause, Sebastien Willemijns, Alexey Simak, Brendan Jurd,
 Robson Braga Araujo

        Thanks! (and sorry if I forgot to mention someone)
+2 −2
Original line number Diff line number Diff line
@@ -329,7 +329,7 @@ static CURLcode ftp_readresp(curl_socket_t sockfd,
       * line */
      int i;

      k->headerbytecount += gotbytes;
      conn->headerbytecount += gotbytes;

      ftpc->nread_resp += gotbytes;
      for(i = 0; i < gotbytes; ptr++, i++) {
@@ -562,7 +562,7 @@ CURLcode Curl_GetFTPResponse(ssize_t *nreadp, /* return number of bytes read */
         * line */
        int i;

        k->headerbytecount += gotbytes;
        conn->headerbytecount += gotbytes;

        *nreadp += gotbytes;
        for(i = 0; i < gotbytes; ptr++, i++) {
+2 −2
Original line number Diff line number Diff line
@@ -1527,8 +1527,8 @@ CURLcode Curl_http_done(struct connectdata *conn,

  if(!conn->bits.retry &&
     ((http->readbytecount +
       k->headerbytecount -
       k->deductheadercount)) <= 0) {
       conn->headerbytecount -
       conn->deductheadercount)) <= 0) {
    /* If this connection isn't simply closed to be retried, AND nothing was
       read from the HTTP server (that counts), this can't be right so we
       return an error here */
+5 −6
Original line number Diff line number Diff line
@@ -581,10 +581,10 @@ CURLcode Curl_readwrite(struct connectdata *conn,
                return result;

              data->info.header_size += (long)headerlen;
              k->headerbytecount += (long)headerlen;
              conn->headerbytecount += (long)headerlen;

              k->deductheadercount =
                (100 == k->httpcode)?k->headerbytecount:0;
              conn->deductheadercount =
                (100 == k->httpcode)?conn->headerbytecount:0;

              if (data->reqdata.resume_from &&
                  (data->set.httpreq==HTTPREQ_GET) &&
@@ -1040,7 +1040,7 @@ CURLcode Curl_readwrite(struct connectdata *conn,
              return result;

            data->info.header_size += (long)k->hbuflen;
            k->headerbytecount += (long)k->hbuflen;
            conn->headerbytecount += (long)k->hbuflen;

            /* reset hbufp pointer && hbuflen */
            k->hbufp = data->state.headerbuff;
@@ -1564,7 +1564,6 @@ CURLcode Curl_readwrite_init(struct connectdata *conn)
  k->writebytecountp = data->reqdata.writebytecountp;

  k->bytecount = 0;
  k->headerbytecount = 0;

  k->buf = data->state.buffer;
  k->uploadbuf = data->state.uploadbuffer;
@@ -2247,7 +2246,7 @@ bool Curl_retry_request(struct connectdata *conn,
  struct SessionHandle *data = conn->data;
  struct Curl_transfer_keeper *k = &data->reqdata.keep;

  if((data->reqdata.keep.bytecount+k->headerbytecount == 0) &&
  if((data->reqdata.keep.bytecount+conn->headerbytecount == 0) &&
     conn->bits.reuse &&
     !conn->bits.no_body) {
    /* We got no data, we attempted to re-use a connection and yet we want a
Loading