From: Olivier Houchard Date: Tue, 9 Apr 2019 17:17:41 +0000 (+0200) Subject: BUG/MEDIUM: stream: Don't clear the stream_interface flags in si_update_both. X-Git-Tag: v2.0-dev3~326 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=86dcad6c62fc6c2d2f1e16602b3c924fb4da4d5c;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: stream: Don't clear the stream_interface flags in si_update_both. In commit d7704b534, we introduced and expiration flag on the stream interface, which is used for the connect, the queue and the turn around. Because the turn around state isn't an error, the flag was reset in process_stream(), and later in commit cff6411f9 when introducing the SI_FL_ERR flag, the cleanup of the flag at this place was erroneously generalized. To fix this, the SI_FL_EXP flag is only cleared at the end of the turn around state, and nobody should clear the stream interface flags anymore. This should be backported to 1.9, it has no known impact on older versions. --- diff --git a/src/stream.c b/src/stream.c index 70e98b83cc..cac9a36640 100644 --- a/src/stream.c +++ b/src/stream.c @@ -1051,6 +1051,8 @@ static void sess_update_stream_int(struct stream *s) if (!(si->flags & SI_FL_EXP)) return; /* still in turn-around */ + si->flags &= ~SI_FL_EXP; + si->exp = TICK_ETERNITY; /* we keep trying on the same server as long as the stream is diff --git a/src/stream_interface.c b/src/stream_interface.c index da31482eeb..a46368b25e 100644 --- a/src/stream_interface.c +++ b/src/stream_interface.c @@ -830,9 +830,6 @@ void si_update_both(struct stream_interface *si_f, struct stream_interface *si_b req->flags &= ~(CF_READ_NULL|CF_READ_PARTIAL|CF_READ_ATTACHED|CF_WRITE_NULL|CF_WRITE_PARTIAL); res->flags &= ~(CF_READ_NULL|CF_READ_PARTIAL|CF_READ_ATTACHED|CF_WRITE_NULL|CF_WRITE_PARTIAL); - si_f->flags &= ~SI_FL_EXP; - si_b->flags &= ~SI_FL_EXP; - si_f->prev_state = si_f->state; si_b->prev_state = si_b->state;