From 642016ce033aeb5ccc09b81b98db8046eefd2e2c Mon Sep 17 00:00:00 2001 From: Amaury Denoyelle Date: Fri, 22 Dec 2023 11:45:54 +0100 Subject: [PATCH] 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(). --- src/h3.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/h3.c b/src/h3.c index 1991e9cfc..60b8673c1 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