diff options
author | Craig Tiller <ctiller@google.com> | 2017-03-20 18:31:12 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-03-20 18:31:12 -0700 |
commit | 7c050ea8c6c10750b58396468c8bec824dd5c53a (patch) | |
tree | 88fa638476d174a297d8313419943c3be26f112b /src | |
parent | 496734412b765525a2afeaa88439d33b08e359c6 (diff) | |
parent | d9dd625f6080577abf31c4f8fe4f869ba0d6a233 (diff) |
Merge pull request #10102 from ctiller/fuzzing-long
Fix fuzzing detected error: stack overflow in hpack parser
Diffstat (limited to 'src')
-rw-r--r-- | src/core/ext/transport/chttp2/transport/hpack_parser.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/src/core/ext/transport/chttp2/transport/hpack_parser.c b/src/core/ext/transport/chttp2/transport/hpack_parser.c index 40f5120308..1865b997b7 100644 --- a/src/core/ext/transport/chttp2/transport/hpack_parser.c +++ b/src/core/ext/transport/chttp2/transport/hpack_parser.c @@ -1620,13 +1620,18 @@ void grpc_chttp2_hpack_parser_destroy(grpc_exec_ctx *exec_ctx, grpc_error *grpc_chttp2_hpack_parser_parse(grpc_exec_ctx *exec_ctx, grpc_chttp2_hpack_parser *p, grpc_slice slice) { - /* TODO(ctiller): limit the distance of end from beg, and perform multiple - steps in the event of a large chunk of data to limit - stack space usage when no tail call optimization is - available */ +/* max number of bytes to parse at a time... limits call stack depth on + * compilers without TCO */ +#define MAX_PARSE_LENGTH 1024 p->current_slice_refcount = slice.refcount; - grpc_error *error = p->state(exec_ctx, p, GRPC_SLICE_START_PTR(slice), - GRPC_SLICE_END_PTR(slice)); + uint8_t *start = GRPC_SLICE_START_PTR(slice); + uint8_t *end = GRPC_SLICE_END_PTR(slice); + grpc_error *error = GRPC_ERROR_NONE; + while (start != end && error == GRPC_ERROR_NONE) { + uint8_t *target = start + GPR_MIN(MAX_PARSE_LENGTH, end - start); + error = p->state(exec_ctx, p, start, target); + start = target; + } p->current_slice_refcount = NULL; return error; } |