]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: http-ana: Properly detect client abort when forwarding the response
authorChristopher Faulet <cfaulet@haproxy.com>
Tue, 15 Apr 2025 05:54:19 +0000 (07:54 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Tue, 15 Apr 2025 14:28:15 +0000 (16:28 +0200)
During the response payload forwarding, if the back SC is closed, we try to
figure out if it is because of a client abort or a server abort. However,
the condition was not accurrate, especially when abortonclose option is
set. Because of this issue, a server abort may be reported (SD-- in logs)
instead of a client abort (CD-- in logs).

The right way to detect a client abort when we try to forward the response
is to test if the back SC was shut down (SC_FL_SHUT_DOWN flag set) AND
aborted (SC_FL_ABRT_DONE flag set). When these both flags are set, it means
the back connection underwent the shutdown, which should be converted to a
client abort at this stage.

This patch should be backported as far as 2.8. It should fix last strange SD
report in the issue #2749.

src/http_ana.c

index 09a53b0f3a9ec760cc9fcabe48b7c2761d47fb41..68db27f56ab01273622094bfeb16d0c6c1e97cca 100644 (file)
@@ -2215,8 +2215,7 @@ int http_response_forward_body(struct stream *s, struct channel *res, int an_bit
         * server abort.
         */
        if (msg->msg_state < HTTP_MSG_ENDING && (s->scb->flags & (SC_FL_EOS|SC_FL_ABRT_DONE))) {
-               if ((s->scf->flags & SC_FL_ABRT_DONE) &&
-                   (s->scb->flags & SC_FL_SHUT_DONE))
+               if ((s->scb->flags & (SC_FL_ABRT_DONE|SC_FL_SHUT_DONE)) == (SC_FL_ABRT_DONE|SC_FL_SHUT_DONE))
                        goto return_cli_abort;
                /* If we have some pending data, we continue the processing */
                if (htx_is_empty(htx))