From: Amaury Denoyelle Date: Fri, 22 Dec 2023 10:45:54 +0000 (+0100) Subject: MINOR: h3: check connection error during sending X-Git-Tag: v3.0-dev1~37 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=642016ce033aeb5ccc09b81b98db8046eefd2e2c;p=thirdparty%2Fhaproxy.git MINOR: h3: check connection error during sending If an error occurs during HTX to H3 encoding, h3_snd_buf() should be interrupted. This commit add this possibility by checking for member value. If non null, sending loop is stopped and an error is reported using qcc_set_error(). This commit does not change any behavior for now, as is never set during sending. However, this will change in future commits, most notably to reject too many headers or handle buffer allocation failure. As such, this commit should be backported along the following fixes. Note that in 2.6 qcc_set_error() does not exist and must be replaced by qcc_emit_cc_app(). --- diff --git a/src/h3.c b/src/h3.c index 1991e9cfcd..60b8673c11 100644 --- a/src/h3.c +++ b/src/h3.c @@ -1866,6 +1866,8 @@ static int h3_resp_data_send(struct qcs *qcs, struct htx *htx, static size_t h3_snd_buf(struct qcs *qcs, struct buffer *buf, size_t count) { + struct h3s *h3s = qcs->ctx; + struct h3c *h3c = h3s->h3c; size_t total = 0; enum htx_blk_type btype; struct htx *htx; @@ -1878,7 +1880,9 @@ static size_t h3_snd_buf(struct qcs *qcs, struct buffer *buf, size_t count) htx = htx_from_buf(buf); - while (count && !htx_is_empty(htx) && !(qcs->flags & QC_SF_BLK_MROOM)) { + while (count && !htx_is_empty(htx) && + !(qcs->flags & QC_SF_BLK_MROOM) && !h3c->err) { + idx = htx_get_head(htx); blk = htx_get_blk(htx, idx); btype = htx_get_blk_type(blk); @@ -1931,6 +1935,12 @@ static size_t h3_snd_buf(struct qcs *qcs, struct buffer *buf, size_t count) } } + /* Interrupt sending on connection error. */ + if (unlikely(h3c->err)) { + qcc_set_error(qcs->qcc, h3c->err, 1); + goto out; + } + /* RFC 9114 4.1. HTTP Message Framing * * A server can send a complete response prior to the client sending an