]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: stconn: Don't forward shut for SC in connecting state
authorChristopher Faulet <cfaulet@haproxy.com>
Wed, 30 Oct 2024 15:41:39 +0000 (16:41 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Wed, 13 Nov 2024 09:53:27 +0000 (10:53 +0100)
In connecting state, shutdown must not be forwarded or scheduled because
otherwise this will prevent any connection retries. Indeed, if a EOS is
reported by the mux during the connection establishment, this should be
handled by the stream to eventually retries. If the write side is closed
first, this will not be possible because the stconn will be switched in DIS
state. If the shut is scheduled because pending data are blocked, the same
may happen, depending on the abort-on-close option.

This patch should be slowly be backported as far as 2.4. But an observation
period is mandatory. On 2.4, the patch must be adapted to use the
stream-interface API.

src/stconn.c

index 1d4ebeaf385ce5211e07c7e12d8f1e4226b612f2..a19fa1c8e12117d9007f7dd489ac87c3eb03ea21 100644 (file)
@@ -1236,7 +1236,7 @@ static void sc_conn_eos(struct stconn *sc)
        ic->flags |= CF_READ_EVENT;
        sc_ep_report_read_activity(sc);
 
-       if (!sc_state_in(sc->state, SC_SB_CON|SC_SB_RDY|SC_SB_EST))
+       if (sc->state != SC_ST_EST)
                return;
 
        if (sc->flags & SC_FL_SHUT_DONE)
@@ -1940,7 +1940,7 @@ static void sc_applet_eos(struct stconn *sc)
 
        /* Note: on abort, we don't call the applet */
 
-       if (!sc_state_in(sc->state, SC_SB_CON|SC_SB_RDY|SC_SB_EST))
+       if (sc->state != SC_ST_EST)
                return;
 
        if (sc->flags & SC_FL_SHUT_DONE) {