]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: quic: Unitialized mux context upon Client Hello message receipt.
authorFrédéric Lécaille <flecaille@haproxy.com>
Wed, 21 Jul 2021 07:34:27 +0000 (09:34 +0200)
committerAmaury Denoyelle <adenoyelle@haproxy.com>
Thu, 23 Sep 2021 13:27:25 +0000 (15:27 +0200)
If we let the connection packet handler task (quic_conn_io_cb) process the first
client Initial packet which contain the TLS Client Hello message before the mux
context is initialized, quic_mux_transport_params_update() makes haproxy crash.
->start xprt callback already wakes up this task and is called after all the
connection contexts are initialized. So, this patch do not wakes up quic_conn_io_cb()
if the mux context is not initialized (this was already the case for the connection
context (conn_ctx)).

src/mux_quic.c
src/xprt_quic.c

index fc51f0f7dc4aede0c75844ca7a82fbab9503c553..a7e38382055b1eb6e3eba39bd4a28e254da03082 100644 (file)
@@ -741,7 +741,7 @@ static int qc_init(struct connection *conn, struct proxy *prx,
        LIST_INIT(&qcc->buf_wait.list);
        MT_LIST_INIT(&qcc->qcs_rxbuf_wlist);
 
-       conn->ctx = qcc;
+       HA_ATOMIC_STORE(&conn->ctx, qcc);
 
        if (t)
                task_queue(t);
index 5bc3495d57c6e05dce3f2e11a5fccb65f02ab81c..eec3b5cd00652659c080ffd6a758ac6b0ce8bf89 100644 (file)
@@ -3441,8 +3441,13 @@ static ssize_t qc_lstnr_pkt_rcv(unsigned char **buf, const unsigned char *end,
 
 
        TRACE_PROTO("New packet", QUIC_EV_CONN_LPKT, qc->conn, pkt);
-       if (conn_ctx)
-               /* Wake the tasklet of the QUIC connection packet handler. */
+       /* Wake up the connection packet handler task from here only if all
+        * the contexts have been initialized, especially the mux context
+        * conn_ctx->conn->ctx. Note that this is ->start xprt callback which
+        * will start it if these contexts for the connection are not already
+        * initialized.
+        */
+       if (conn_ctx && HA_ATOMIC_LOAD(&conn_ctx->conn->ctx))
                tasklet_wakeup(conn_ctx->wait_event.tasklet);
 
        TRACE_LEAVE(QUIC_EV_CONN_LPKT, qc->conn, pkt);