MINOR: quic: Do not wakeup the I/O handler before the mux is started

If we wakeup the I/O handler before the mux is started, it is possible
it has enough time to parse the ClientHello TLS message and update the
mux transport parameters, leading to a crash.
So, we initialize ->qcc quic_conn struct member at the very last time,
when the mux if fully initialized. The condition to wakeup the I/O handler
from lstnr_rcv_pkt() is: xprt context and mux both initialized.
Note that if the xprt context is initialized, it implies its tasklet is
initialized. So, we do not check anymore this latter condition.
This commit is contained in:
Frédéric Lécaille 2022-01-12 17:46:56 +01:00 committed by Amaury Denoyelle
parent bec186dde5
commit b80b20c6ff
2 changed files with 2 additions and 2 deletions

View File

@ -395,7 +395,6 @@ static int qc_init(struct connection *conn, struct proxy *prx,
qcc->conn = conn;
conn->ctx = qcc;
conn->qc->qcc = qcc;
qcc->app_ops = NULL;
@ -441,6 +440,7 @@ static int qc_init(struct connection *conn, struct proxy *prx,
qcc->wait_event.tasklet->process = qc_io_cb;
qcc->wait_event.tasklet->context = qcc;
HA_ATOMIC_STORE(&conn->qc->qcc, qcc);
/* init read cycle */
tasklet_wakeup(qcc->wait_event.tasklet);

View File

@ -4456,7 +4456,7 @@ static ssize_t qc_lstnr_pkt_rcv(unsigned char *buf, const unsigned char *end,
* initialized.
*/
conn_ctx = HA_ATOMIC_LOAD(&qc->xprt_ctx);
if (conn_ctx && conn_ctx->wait_event.tasklet)
if (conn_ctx && HA_ATOMIC_LOAD(&qc->qcc))
tasklet_wakeup(conn_ctx->wait_event.tasklet);
TRACE_LEAVE(QUIC_EV_CONN_LPKT, qc ? qc : NULL, pkt);