From: Willy Tarreau Date: Tue, 13 Jan 2015 18:07:23 +0000 (+0100) Subject: BUG/MINOR: channel: compare to_forward with buf->i, not buf->size X-Git-Tag: v1.6-dev1~198 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bb3f994f1a379289534c4ccf0f790df7b69d2611;p=thirdparty%2Fhaproxy.git BUG/MINOR: channel: compare to_forward with buf->i, not buf->size We know that all incoming data are going to be purged if to_forward is greater than them, not only if greater than the buffer size. This buf has no direct impact on this version, but it participates to some bugs affecting http-send-name-header since 1.4. This fix will have to be backported down to 1.4 albeit in a different form. --- diff --git a/include/proto/channel.h b/include/proto/channel.h index 3ec9218645..ca08ff1cf5 100644 --- a/include/proto/channel.h +++ b/include/proto/channel.h @@ -138,10 +138,13 @@ static inline int channel_full(const struct channel *chn) if (!rem) return 1; /* buffer already full */ - if (chn->to_forward >= chn->buf->size || - (CHN_INFINITE_FORWARD < MAX_RANGE(typeof(chn->buf->size)) && // just there to ensure gcc - chn->to_forward == CHN_INFINITE_FORWARD)) // avoids the useless second - return 0; // test whenever possible + /* now we know there's some room left, verify if we're touching + * the reserve with some permanent input data. + */ + if (chn->to_forward >= chn->buf->i || + (CHN_INFINITE_FORWARD < MAX_RANGE(typeof(chn->buf->i)) && // just there to ensure gcc + chn->to_forward == CHN_INFINITE_FORWARD)) // avoids the useless second + return 0; // test whenever possible rem -= global.tune.maxrewrite; rem += chn->buf->o; @@ -300,8 +303,8 @@ static inline int bi_avail(const struct channel *chn) if (!rem) return rem; /* buffer already full */ - if (chn->to_forward >= chn->buf->size || - (CHN_INFINITE_FORWARD < MAX_RANGE(typeof(chn->buf->size)) && // just there to ensure gcc + if (chn->to_forward >= chn->buf->i || + (CHN_INFINITE_FORWARD < MAX_RANGE(typeof(chn->buf->i)) && // just there to ensure gcc chn->to_forward == CHN_INFINITE_FORWARD)) // avoids the useless second return rem; // test whenever possible