*/
if (h3c->flags & H3_CF_GOAWAY_SENT && qcs->id >= h3c->id_goaway &&
quic_stream_is_bidi(qcs->id)) {
+ /* Local stack should not attached stream on a closed connection. */
+ BUG_ON(quic_stream_is_local(qcs->qcc, qcs->id));
+
TRACE_STATE("close stream outside of goaway range", H3_EV_H3S_NEW, qcs->qcc->conn, qcs);
qcc_abort_stream_read(qcs);
qcc_reset_stream(qcs, H3_ERR_REQUEST_REJECTED);
if (!(qcc->conn->handle.qc->flags & QUIC_FL_CONN_IMMEDIATE_CLOSE))
qcc->conn->handle.qc->err = qcc->err;
+ /* A connection is not reusable if app layer is closed. */
+ if (qcc->flags & QC_CF_IS_BACK)
+ conn_delete_from_tree(qcc->conn);
+
out:
qcc->app_st = QCC_APP_ST_SHUT;
TRACE_LEAVE(QMUX_EV_QCC_END, qcc->conn);
*/
BUG_ON(!qcc_fctl_avail_streams(qcc, 1));
+ /* Connnection should not be reused if already on error/closed. */
+ BUG_ON(qcc->flags & QC_CF_ERRL || qcc->app_st >= QCC_APP_ST_SHUT);
+
qcs = qcc_init_stream_local(qcc, 1);
if (!qcs) {
TRACE_DEVEL("leaving on error", QMUX_EV_QCS_NEW, qcc->conn);
qcs_destroy(qcs);
/* Backend connection can be reused unless it is already on error/closed. */
- if (qcc->flags & QC_CF_IS_BACK && !qcc_is_dead(qcc)) {
+ if ((qcc->flags & QC_CF_IS_BACK) && !qcc_is_dead(qcc) &&
+ qcc->app_st == QCC_APP_ST_INIT) {
if (!(conn->flags & CO_FL_PRIVATE)) {
if (!qcc->nb_sc) {
TRACE_DEVEL("prepare for idle connection reuse", QMUX_EV_STRM_END, conn);