From 6b02c6bb471f92291ce4817b181e5c39f0db4018 Mon Sep 17 00:00:00 2001 From: Amaury Denoyelle Date: Tue, 16 Aug 2022 17:16:47 +0200 Subject: [PATCH] MINOR: h3: report error on control stream close As specified by RFC 9114 the control stream must not be closed. If the peer behaves incorrectly and closes it, emit a H3_CLOSED_CRITICAL_STREAM connection error. --- src/h3.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/h3.c b/src/h3.c index 688f9030a8..026f7d9e71 100644 --- a/src/h3.c +++ b/src/h3.c @@ -625,6 +625,18 @@ static ssize_t h3_decode_qcs(struct qcs *qcs, struct buffer *b, int fin) return total; } + /* RFC 9114 6.2.1. Control Streams + * + * The sender MUST NOT close the control stream, and the receiver MUST NOT + * request that the sender close the control stream. If either control + * stream is closed at any point, this MUST be treated as a connection + * error of type H3_CLOSED_CRITICAL_STREAM. + */ + if (h3s->type == H3S_T_CTRL && fin) { + qcc_emit_cc_app(qcs->qcc, H3_CLOSED_CRITICAL_STREAM, 1); + return -1; + } + while (b_data(b) && !(qcs->flags & QC_SF_DEM_FULL)) { uint64_t ftype, flen; char last_stream_frame = 0; -- 2.47.3