From b0b8e9bbd2b720ed2aff469d0989ce00876007dc Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Thu, 15 Sep 2022 16:21:55 +0200 Subject: [PATCH] BUG/MINOR: mux-h1: Account consumed output data on synchronous connection error The commit 372b38f935 ("BUG/MEDIUM: mux-h1: Handle connection error after a synchronous send") introduced a bug. In h1_snd_buf(), consumed data are not properly accounted if a connection error is detected. Indeed, data are consumed when the output buffer is filled. But, on connection error, we exit from the loop without incremented total variable accordingly. When this happens, this leaves the channel buffer in an inconsistent state. The buffer may be empty with some output at the channel level. Because an error is reported, it is harmless. But it is safer to fix this bug now to avoid any regression in future. This patch must be backported as far as 2.2. --- src/mux_h1.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/mux_h1.c b/src/mux_h1.c index 259f71efb..b1be71df5 100644 --- a/src/mux_h1.c +++ b/src/mux_h1.c @@ -3675,18 +3675,20 @@ static size_t h1_snd_buf(struct stconn *sc, struct buffer *buf, size_t count, in else TRACE_DEVEL("h1c obuf not allocated", H1_EV_STRM_SEND|H1_EV_H1S_BLK, h1c->conn, h1s); - if ((h1c->conn->flags & (CO_FL_ERROR|CO_FL_SOCK_WR_SH))) + if (!ret) break; if ((count - ret) > 0) h1c->flags |= H1C_F_CO_MSG_MORE; - if (!ret) - break; total += ret; count -= ret; + if ((h1c->wait_event.events & SUB_RETRY_SEND) || !h1_send(h1c)) break; + + if ((h1c->conn->flags & (CO_FL_ERROR|CO_FL_SOCK_WR_SH))) + break; } if ((h1c->flags & H1C_F_ST_ERROR) || ((h1c->conn->flags & CO_FL_ERROR) &&