From 37dd54d8d459e190c88f18bf8d99a733596fb7df Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Sat, 15 Dec 2018 14:48:31 +0100 Subject: [PATCH] BUG/MEDIUM: mux-h1: make sure we always have at least one HTX block to send Commit 84cca66 ("BUG/MEDIUM: htx: When performing zero-copy, start from the right offset.") uncovered another issue which is that the send function may occasionally be called without any block. It's important to check for this case when computing the zero-copy offsets. No backport is needed. --- src/mux_h1.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/mux_h1.c b/src/mux_h1.c index 32004c68c..09c29c2f0 100644 --- a/src/mux_h1.c +++ b/src/mux_h1.c @@ -1367,7 +1367,10 @@ static size_t h1_process_output(struct h1c *h1c, struct buffer *buf, size_t coun if (!count) goto end; + chn_htx = htx_from_buf(buf); + if (htx_is_empty(chn_htx)) + goto end; if (!h1_get_buf(h1c, &h1c->obuf)) { h1c->flags |= H1C_F_OUT_ALLOC; @@ -1383,6 +1386,7 @@ static size_t h1_process_output(struct h1c *h1c, struct buffer *buf, size_t coun errflag = H1S_F_REQ_ERROR; } + /* the htx is non-empty thus has at least one block */ blk = htx_get_head_blk(chn_htx); tmp = get_trash_chunk(); @@ -1407,7 +1411,7 @@ static size_t h1_process_output(struct h1c *h1c, struct buffer *buf, size_t coun h1c->obuf.head = sizeof(struct htx) + blk->addr; if (chn_htx->used == 1 && - blk && htx_get_blk_type(blk) == HTX_BLK_DATA && + htx_get_blk_type(blk) == HTX_BLK_DATA && htx_get_blk_value(chn_htx, blk).len == count) { void *old_area = h1c->obuf.area;