BUG/MEDIUM: mux-h2: Fix dfl calculation when merging CONTINUATION frames
authorChristopher Faulet <cfaulet@haproxy.com>
Wed, 21 Apr 2021 09:11:21 +0000 (11:11 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Wed, 21 Apr 2021 10:13:12 +0000 (12:13 +0200)
When header are splitted over several frames, payload of HEADERS and
CONTINUATION frames are merged to form a unique HEADERS frame before
decoding the payload. To do so, info about the current frame are updated
(dff, dfl..) with info of the next one. Here there is a bug when the frame
length (dfl) is update. We must add the next frame length (hdr.dfl) and not
only the amount of data found in the buffer (clen). Because HEADERS frames
are decoded in one pass, dfl value is the whole frame length or 0. nothing
intermediary.

This patch must be backported as far as 2.0.

src/mux_h2.c

index 695eb16..35767b1 100644 (file)
@@ -4642,7 +4642,7 @@ next_frame:
                 * above). The hole moves after the new aggragated frame.
                 */
                b_move(&h2c->dbuf, b_peek_ofs(&h2c->dbuf, h2c->dfl + hole + 9), clen, -(h2c->dpl + hole + 9));
-               h2c->dfl += clen - h2c->dpl;
+               h2c->dfl += hdr.len - h2c->dpl;
                hole     += h2c->dpl + 9;
                h2c->dpl  = 0;
                TRACE_STATE("waiting for next continuation frame", H2_EV_RX_FRAME|H2_EV_RX_FHDR|H2_EV_RX_CONT|H2_EV_RX_HDR, h2c->conn);