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.

(cherry picked from commit b0b8e9bbd2b720ed2aff469d0989ce00876007dc)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
(cherry picked from commit 88316b6b99077ba6db47448d8f0838cf4144d5b0)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
(cherry picked from commit a9c507f0ab13e5b65c98d3a45dbef4c369f468e1)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
diff --git a/src/mux_h1.c b/src/mux_h1.c
index a230365..9bb3d3a 100644
--- a/src/mux_h1.c
+++ b/src/mux_h1.c
@@ -3501,18 +3501,20 @@
 		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) &&