]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: mux_quic: fix BE conn removal on app shutdown
authorAmaury Denoyelle <adenoyelle@haproxy.com>
Thu, 28 May 2026 14:44:03 +0000 (16:44 +0200)
committerAmaury Denoyelle <adenoyelle@haproxy.com>
Thu, 28 May 2026 15:36:05 +0000 (17:36 +0200)
When QUIC application layer is shut for a backend connection, the
connection is immediately removed from its idle pool. This is a nice
optimization as this prevents a future streams to try to reuse an
unusable connection. This is implemented since the following commit.

  00d668549e46b34d29ea3daa1f6dd42b5251a365
  MINOR: mux-quic: do not reuse connection if app already shut

However, this removal is not correctly performed as it is used
conn_delete_from_tree(). For private connections, this can cause crashes
as they are stored in the session instead. Thus, connection status is
now properly check, and alternatively session_unown_conn() is used if
stored in the session.

This must be backported up to 3.3.

src/mux_quic.c

index 2edc88b78aeb454a88cecc7b8a95af20910f5767..58c94a1f0773c53e4d69d465244b313c6425219d 100644 (file)
@@ -3555,8 +3555,12 @@ static void qcc_app_shutdown(struct qcc *qcc)
        }
 
        /* A connection is not reusable if app layer is closed. */
-       if (qcc->flags & QC_CF_IS_BACK)
-               conn_delete_from_tree(qcc->conn, tid);
+       if (qcc->flags & QC_CF_IS_BACK) {
+               if (qcc->conn->flags & CO_FL_LIST_MASK)
+                       conn_delete_from_tree(qcc->conn, tid);
+               else if (qcc->conn->flags & CO_FL_SESS_IDLE)
+                       session_unown_conn(qcc->conn->owner, qcc->conn);
+       }
 
  out:
        qcc->app_st = QCC_APP_ST_SHUT;