]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: stream: Keep FLT_END analyzers if a stream detects a channel error
authorChristopher Faulet <cfaulet@haproxy.com>
Mon, 18 Oct 2021 13:06:20 +0000 (15:06 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Tue, 19 Oct 2021 09:29:30 +0000 (11:29 +0200)
If a channel error (READ_ERRO|READ_TIMEOUT|WRITE_ERROR|WRITE_TIMEOUT) is
detected by the stream, in process_stream(), FLT_END analyers must be
preserved. It is important to be sure to ends filter analysis and be able to
release the stream.

First, filters may release some ressources when FLT_END analyzers are
called. Then, the CF_FL_ANALYZE flag is used to sync end of analysis for the
request and the response. If FLT_END analyzer is ignored on a channel, this
may block the other side and freeze the stream.

This patch must be backported to all stable versions

src/stream.c

index c2e3ff9ff50eb36e3ebd75d7b15da06e48fcd780..524ae33e8a0ec3d1a0a80ad14d2427a649a2cd60 100644 (file)
@@ -2008,7 +2008,7 @@ struct task *process_stream(struct task *t, void *context, unsigned int state)
        if (unlikely(!(s->flags & SF_ERR_MASK))) {
                if (req->flags & (CF_READ_ERROR|CF_READ_TIMEOUT|CF_WRITE_ERROR|CF_WRITE_TIMEOUT)) {
                        /* Report it if the client got an error or a read timeout expired */
-                       req->analysers = 0;
+                       req->analysers &= AN_REQ_FLT_END;
                        if (req->flags & CF_READ_ERROR) {
                                _HA_ATOMIC_INC(&s->be->be_counters.cli_aborts);
                                _HA_ATOMIC_INC(&sess->fe->fe_counters.cli_aborts);
@@ -2062,7 +2062,7 @@ struct task *process_stream(struct task *t, void *context, unsigned int state)
                }
                else if (res->flags & (CF_READ_ERROR|CF_READ_TIMEOUT|CF_WRITE_ERROR|CF_WRITE_TIMEOUT)) {
                        /* Report it if the server got an error or a read timeout expired */
-                       res->analysers = 0;
+                       res->analysers &= AN_RES_FLT_END;
                        if (res->flags & CF_READ_ERROR) {
                                _HA_ATOMIC_INC(&s->be->be_counters.srv_aborts);
                                _HA_ATOMIC_INC(&sess->fe->fe_counters.srv_aborts);