MINOR: mux-quic: change return value of qcs_attach_sc()
authorAmaury Denoyelle <adenoyelle@haproxy.com>
Fri, 3 Jan 2025 15:16:45 +0000 (16:16 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Wed, 19 Feb 2025 12:08:33 +0000 (13:08 +0100)
A recent fix was introduced to ensure that a streamdesc instance won't
be attached to an already completed QCS which is eligible to purging.
This was performed by skipping application protocol decoding if a QCS is
in such a state. Here is the patch responsible for this change.
  caf60ac696a29799631a76beb16d0072f65eef12
  BUG/MEDIUM: mux-quic: do not attach on already closed stream

However, this is too restrictive, in particular for unidirection stream
where no streamdesc is never attached. To fix this behavior, first
qcs_attach_sc() API has been modified. Instead of returning a streamdesc
instance, it returns either 0 on success or a negative error code.

There should be no functional changes with this patch. It is only to be
able to extend qcs_attach_sc() with the possibility of skipping
streamdesc instantiation while still keeping a success return value.

This should be backported wherever the above patch has been merged. For
the record, it was scheduled for immediate backport on 3.1, plus merging
on older releases up to 2.8 after a period of observation.

(cherry picked from commit af00be8e0f7fe3942fac93ac32bfe7ae7f5b78c9)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
(cherry picked from commit 1bcdf3c5f2528910930209dbbcfff2556d44c45a)
[cf: ctx adjt]
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>

include/haproxy/mux_quic.h
src/h3.c
src/hq_interop.c
src/mux_quic.c

index 1ed8ad1..719abb3 100644 (file)
@@ -15,7 +15,7 @@
 void qcc_set_error(struct qcc *qcc, int err, int app);
 int qcc_report_glitch(struct qcc *qcc, int inc);
 struct qcs *qcc_init_stream_local(struct qcc *qcc, int bidi);
-struct stconn *qcs_attach_sc(struct qcs *qcs, struct buffer *buf, char fin);
+int qcs_attach_sc(struct qcs *qcs, struct buffer *buf, char fin);
 int qcs_is_close_local(struct qcs *qcs);
 int qcs_is_close_remote(struct qcs *qcs);
 
index 5299769..b760d36 100644 (file)
--- a/src/h3.c
+++ b/src/h3.c
@@ -915,7 +915,7 @@ static ssize_t h3_headers_to_htx(struct qcs *qcs, const struct buffer *buf,
        htx_to_buf(htx, &htx_buf);
        htx = NULL;
 
-       if (!qcs_attach_sc(qcs, &htx_buf, fin)) {
+       if (qcs_attach_sc(qcs, &htx_buf, fin)) {
                len = -1;
                goto out;
        }
index c88f888..3f309bb 100644 (file)
@@ -77,7 +77,7 @@ static ssize_t hq_interop_rcv_buf(struct qcs *qcs, struct buffer *b, int fin)
        htx->flags |= HTX_FL_EOM;
        htx_to_buf(htx, &htx_buf);
 
-       if (!qcs_attach_sc(qcs, &htx_buf, fin))
+       if (qcs_attach_sc(qcs, &htx_buf, fin))
                return -1;
 
        b_free(&htx_buf);
index afb820c..a68d5f2 100644 (file)
@@ -710,7 +710,14 @@ static struct qcs *qcc_init_stream_remote(struct qcc *qcc, uint64_t id)
        return NULL;
 }
 
-struct stconn *qcs_attach_sc(struct qcs *qcs, struct buffer *buf, char fin)
+/* Instantiate a streamdesc instance for <qcs> stream. This is necessary to
+ * transfer data after a new request reception. <buf> can be used to forward
+ * the first received request data. <fin> must be set if the whole request is
+ * already received.
+ *
+ * Returns 0 on success else a negative error code.
+ */
+int qcs_attach_sc(struct qcs *qcs, struct buffer *buf, char fin)
 {
        struct qcc *qcc = qcs->qcc;
        struct session *sess = qcc->conn->owner;
@@ -720,7 +727,7 @@ struct stconn *qcs_attach_sc(struct qcs *qcs, struct buffer *buf, char fin)
        sess->t_idle = ns_to_ms(now_ns - sess->accept_ts) - sess->t_handshake;
 
        if (!sc_new_from_endp(qcs->sd, sess, buf))
-               return NULL;
+               return -1;
 
        /* QC_SF_HREQ_RECV must be set once for a stream. Else, nb_hreq counter
         * will be incorrect for the connection.
@@ -764,7 +771,7 @@ struct stconn *qcs_attach_sc(struct qcs *qcs, struct buffer *buf, char fin)
                se_fl_set_error(qcs->sd);
        }
 
-       return qcs->sd->sc;
+       return 0;
 }
 
 /* Use this function for a stream <id> which is not in <qcc> stream tree. It