Commit 3e005a85 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

upload: missing rewind call could make libcurl hang

When an upload is done, there are two places where that can be detected
and only one of them would rewind the input stream - which sometimes is
necessary for example when doing NTLM HTTP POSTs and more.

This could then end up libcurl hanging.

Figured-out-by: Isaac Boukris
Reported-by: Anatol Belski

Fixes #741
parent 7db9782d
Loading
Loading
Loading
Loading
+20 −10
Original line number Diff line number Diff line
@@ -816,6 +816,20 @@ static CURLcode readwrite_data(struct SessionHandle *data,
  return CURLE_OK;
}

static CURLcode done_sending(struct connectdata *conn,
                             struct SingleRequest *k)
{
  k->keepon &= ~KEEP_SEND; /* we're done writing */

  if(conn->bits.rewindaftersend) {
    CURLcode result = Curl_readrewind(conn);
    if(result)
      return result;
  }
  return CURLE_OK;
}


/*
 * Send data to upload to the server, when the socket is writable.
 */
@@ -887,14 +901,9 @@ static CURLcode readwrite_upload(struct SessionHandle *data,
        break;
      }
      else if(nread<=0) {
        /* done */
        k->keepon &= ~KEEP_SEND; /* we're done writing */

        if(conn->bits.rewindaftersend) {
          result = Curl_readrewind(conn);
        result = done_sending(conn, k);
        if(result)
          return result;
        }
        break;
      }

@@ -1004,8 +1013,9 @@ static CURLcode readwrite_upload(struct SessionHandle *data,
      data->req.upload_present = 0; /* no more bytes left */

      if(k->upload_done) {
        /* switch off writing, we're done! */
        k->keepon &= ~KEEP_SEND; /* we're done writing */
        result = done_sending(conn, k);
        if(result)
          return result;
      }
    }