]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: stream: Don't release a stream if FLT_END is still registered
authorChristopher Faulet <cfaulet@haproxy.com>
Wed, 13 Nov 2019 10:12:32 +0000 (11:12 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Thu, 12 Aug 2021 06:54:16 +0000 (08:54 +0200)
When at least one filter is registered on a stream, the FLT_END analyzer is
called on both direction when all other analyzers have finished their
processing. During this step, filters may release any allocated elements if
necessary. So it is important to not skip it.

Unfortunately, if both stream interfaces are closed, it is possible to not
wait the end of this analyzer. It is possible to be in this situation if a
filter must wait and prevents the analyzer completion. To fix the bug, we
now wait FLT_END analyzer is no longer registered on both direction before
releasing the stream.

This patch may be backported as far as 1.7, but AFAIK, no filter is affected
by this bug. So the backport seems to be optional for now. In any case, it
should remain under observation for some weeks first.

src/stream.c

index 8ef85e7aa4c1ae5886722f1201b2c588d86f0060..54f5b924e4b53fd291787717178bae5cd68f5c82 100644 (file)
@@ -2438,7 +2438,8 @@ struct task *process_stream(struct task *t, void *context, unsigned int state)
                }
        }
 
-       if (likely((si_f->state != SI_ST_CLO) || !si_state_in(si_b->state, SI_SB_INI|SI_SB_CLO))) {
+       if (likely((si_f->state != SI_ST_CLO) || !si_state_in(si_b->state, SI_SB_INI|SI_SB_CLO) ||
+                  (req->analysers & AN_REQ_FLT_END) || (res->analysers & AN_RES_FLT_END))) {
                if ((sess->fe->options & PR_O_CONTSTATS) && (s->flags & SF_BE_ASSIGNED) && !(s->flags & SF_IGNORE))
                        stream_process_counters(s);