1
0
mirror of https://github.com/moparisthebest/curl synced 2024-12-24 17:18:48 -05:00

header callback: don't chop headers into smaller pieces

Reported-by: Guido Berhoerster
Fixes #2314
Closes #2316
This commit is contained in:
Daniel Stenberg 2018-02-16 10:23:44 +01:00
parent 5e17a5f6cf
commit 367689d8c9
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2
3 changed files with 34 additions and 34 deletions

View File

@ -1079,9 +1079,7 @@ CURLcode curl_easy_pause(struct Curl_easy *data, int action)
/* even if one function returns error, this loops through and frees all /* even if one function returns error, this loops through and frees all
buffers */ buffers */
if(!result) if(!result)
result = Curl_client_chop_write(conn, result = Curl_client_write(conn, writebuf[i].type, writebuf[i].buf,
writebuf[i].type,
writebuf[i].buf,
writebuf[i].len); writebuf[i].len);
free(writebuf[i].buf); free(writebuf[i].buf);
} }

View File

@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
@ -541,18 +541,20 @@ static CURLcode pausewrite(struct Curl_easy *data,
} }
/* Curl_client_chop_write() writes chunks of data not larger than /* chop_write() writes chunks of data not larger than CURL_MAX_WRITE_SIZE via
* CURL_MAX_WRITE_SIZE via client write callback(s) and * client write callback(s) and takes care of pause requests from the
* takes care of pause requests from the callbacks. * callbacks.
*/ */
CURLcode Curl_client_chop_write(struct connectdata *conn, static CURLcode chop_write(struct connectdata *conn,
int type, int type,
char *ptr, char *optr,
size_t len) size_t olen)
{ {
struct Curl_easy *data = conn->data; struct Curl_easy *data = conn->data;
curl_write_callback writeheader = NULL; curl_write_callback writeheader = NULL;
curl_write_callback writebody = NULL; curl_write_callback writebody = NULL;
char *ptr = optr;
size_t len = olen;
if(!len) if(!len)
return CURLE_OK; return CURLE_OK;
@ -598,10 +600,16 @@ CURLcode Curl_client_chop_write(struct connectdata *conn,
} }
} }
ptr += chunklen;
len -= chunklen;
}
if(writeheader) { if(writeheader) {
size_t wrote; size_t wrote;
ptr = optr;
len = olen;
Curl_set_in_callback(data, true); Curl_set_in_callback(data, true);
wrote = writeheader(ptr, 1, chunklen, data->set.writeheader); wrote = writeheader(ptr, 1, len, data->set.writeheader);
Curl_set_in_callback(data, false); Curl_set_in_callback(data, false);
if(CURL_WRITEFUNC_PAUSE == wrote) if(CURL_WRITEFUNC_PAUSE == wrote)
@ -610,16 +618,12 @@ CURLcode Curl_client_chop_write(struct connectdata *conn,
pause, so this is saved for later with the HEADER bit only */ pause, so this is saved for later with the HEADER bit only */
return pausewrite(data, CLIENTWRITE_HEADER, ptr, len); return pausewrite(data, CLIENTWRITE_HEADER, ptr, len);
if(wrote != chunklen) { if(wrote != len) {
failf(data, "Failed writing header"); failf(data, "Failed writing header");
return CURLE_WRITE_ERROR; return CURLE_WRITE_ERROR;
} }
} }
ptr += chunklen;
len -= chunklen;
}
return CURLE_OK; return CURLE_OK;
} }
@ -661,7 +665,7 @@ CURLcode Curl_client_write(struct connectdata *conn,
#endif /* CURL_DO_LINEEND_CONV */ #endif /* CURL_DO_LINEEND_CONV */
} }
return Curl_client_chop_write(conn, type, ptr, len); return chop_write(conn, type, ptr, len);
} }
CURLcode Curl_read_plain(curl_socket_t sockfd, CURLcode Curl_read_plain(curl_socket_t sockfd,

View File

@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
@ -51,8 +51,6 @@ void Curl_failf(struct Curl_easy *, const char *fmt, ...);
#define CLIENTWRITE_HEADER (1<<1) #define CLIENTWRITE_HEADER (1<<1)
#define CLIENTWRITE_BOTH (CLIENTWRITE_BODY|CLIENTWRITE_HEADER) #define CLIENTWRITE_BOTH (CLIENTWRITE_BODY|CLIENTWRITE_HEADER)
CURLcode Curl_client_chop_write(struct connectdata *conn, int type, char *ptr,
size_t len) WARN_UNUSED_RESULT;
CURLcode Curl_client_write(struct connectdata *conn, int type, char *ptr, CURLcode Curl_client_write(struct connectdata *conn, int type, char *ptr,
size_t len) WARN_UNUSED_RESULT; size_t len) WARN_UNUSED_RESULT;