]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: mux-quic: do not prevent shutw on error
authorAmaury Denoyelle <adenoyelle@haproxy.com>
Wed, 10 May 2023 08:41:47 +0000 (10:41 +0200)
committerAmaury Denoyelle <adenoyelle@haproxy.com>
Thu, 11 May 2023 12:04:51 +0000 (14:04 +0200)
Since recent modification of MUX error processing, shutw operation was
skipped for a connection reported as on error. However, this can caused
the stream layer to not be notified about error. The impact of this bug
is unknown but it may lead to stream never closed.

To fix this, simply skip over send operations when connection is on
error while keep notifying the stream layer.

This should be backported up to 2.7.

src/mux_quic.c

index 6746fc87eebcd1f613a861e243e4adb3bef8509c..785f7b4b0b7a606eda7f03a084fff1a65934b434 100644 (file)
@@ -2738,24 +2738,23 @@ static void qc_shutw(struct stconn *sc, enum co_shw_mode mode)
 
        TRACE_ENTER(QMUX_EV_STRM_SHUT, qcc->conn, qcs);
 
-       if (qcc->flags & QC_CF_ERRL) {
-               TRACE_DEVEL("connection on error", QMUX_EV_QCC_END, qcc->conn);
-               goto out;
-       }
-
        /* Early closure reported if QC_SF_FIN_STREAM not yet set. */
        if (!qcs_is_close_local(qcs) &&
            !(qcs->flags & (QC_SF_FIN_STREAM|QC_SF_TO_RESET))) {
 
                if (qcs->flags & QC_SF_UNKNOWN_PL_LENGTH) {
                        /* Close stream with a FIN STREAM frame. */
-                       TRACE_STATE("set FIN STREAM", QMUX_EV_STRM_SHUT, qcc->conn, qcs);
-                       qcs->flags |= QC_SF_FIN_STREAM;
-                       qcc_send_stream(qcs, 0);
+                       if (!(qcc->flags & QC_CF_ERRL)) {
+                               TRACE_STATE("set FIN STREAM",
+                                           QMUX_EV_STRM_SHUT, qcc->conn, qcs);
+                               qcs->flags |= QC_SF_FIN_STREAM;
+                               qcc_send_stream(qcs, 0);
+                       }
                }
                else {
                        /* RESET_STREAM necessary. */
-                       qcc_reset_stream(qcs, 0);
+                       if (!(qcc->flags & QC_CF_ERRL))
+                               qcc_reset_stream(qcs, 0);
                        se_fl_set_error(qcs->sd);
                }