Commit bc61161b by Edward Thomson

httpclient: don't read more than the client wants

When `git_http_client_read_body` is invoked, it provides the size of the
buffer that can be read into.  This will be set as the parser context's
`output_size` member.  Use this as an upper limit on our reads, and
ensure that we do not read more than the client requests.
parent ed045f09
...@@ -1038,6 +1038,7 @@ on_error: ...@@ -1038,6 +1038,7 @@ on_error:
GIT_INLINE(int) client_read(git_http_client *client) GIT_INLINE(int) client_read(git_http_client *client)
{ {
http_parser_context *parser_context = client->parser.data;
git_stream *stream; git_stream *stream;
char *buf = client->read_buf.ptr + client->read_buf.size; char *buf = client->read_buf.ptr + client->read_buf.size;
size_t max_len; size_t max_len;
...@@ -1054,6 +1055,9 @@ GIT_INLINE(int) client_read(git_http_client *client) ...@@ -1054,6 +1055,9 @@ GIT_INLINE(int) client_read(git_http_client *client)
max_len = client->read_buf.asize - client->read_buf.size; max_len = client->read_buf.asize - client->read_buf.size;
max_len = min(max_len, INT_MAX); max_len = min(max_len, INT_MAX);
if (parser_context->output_size)
max_len = min(max_len, parser_context->output_size);
if (max_len == 0) { if (max_len == 0) {
git_error_set(GIT_ERROR_HTTP, "no room in output buffer"); git_error_set(GIT_ERROR_HTTP, "no room in output buffer");
return -1; return -1;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment