diff --git a/lib/roles/h2/http2.c b/lib/roles/h2/http2.c index 8aab20131..9ae46d953 100644 --- a/lib/roles/h2/http2.c +++ b/lib/roles/h2/http2.c @@ -2187,16 +2187,22 @@ lws_h2_parser(struct lws *wsi, unsigned char *in, lws_filepos_t _inlen, __func__, lws_wsi_tag(h2n->swsi)); } + /* + * in + length may cover multiple frames, we + * can only consider the length of the DATA + * in front of us + */ + if (lws_hdr_total_length(h2n->swsi, WSI_TOKEN_HTTP_CONTENT_LENGTH) && h2n->swsi->http.rx_content_length && h2n->swsi->http.rx_content_remain < - lws_ptr_diff_size_t(iend, in) + 1 - 9 && /* last */ + h2n->length && /* last */ h2n->inside < h2n->length) { lwsl_warn("%s: %lu %lu %lu %lu\n", __func__, (unsigned long)h2n->swsi->http.rx_content_remain, - (unsigned long)(lws_ptr_diff_size_t(iend, in) + 1 - 9), + (unsigned long)(lws_ptr_diff_size_t(iend, in) + 1), (unsigned long)h2n->inside, (unsigned long)h2n->length); /* unread data in frame */