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.
}
/* 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;