]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: channel/htx: Don't alter channel during forward for empty HTX message
authorChristopher Faulet <cfaulet@haproxy.com>
Wed, 29 May 2019 12:52:56 +0000 (14:52 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Wed, 5 Jun 2019 08:12:11 +0000 (10:12 +0200)
In channel_htx_forward() and channel_htx_forward_forever(), if the HTX message
is empty, the underlying buffer may be really empty too. And we have no warranty
the caller will call htx_to_buf() later. And in practice, it is almost never
done. So the channel's buffer must not be altered. Otherwise, the buffer may be
considered as full (data == size) for an empty HTX message and no outgoing data.

This patch must be backported to 1.9.

include/proto/channel.h

index d192c9b28e8072d26b6ebeeb939ff1dc28095c9d..563ad1e24db1b77432963f4fe988733fc7f03860 100644 (file)
@@ -383,20 +383,21 @@ static inline void channel_add_input(struct channel *chn, unsigned int len)
 
 static inline unsigned long long channel_htx_forward(struct channel *chn, struct htx *htx, unsigned long long bytes)
 {
-       unsigned long long ret;
+       unsigned long long ret = 0;
 
-       b_set_data(&chn->buf, htx->data);
-       ret = channel_forward(chn, bytes);
-       b_set_data(&chn->buf, b_size(&chn->buf));
+       if (htx->data) {
+               b_set_data(&chn->buf, htx->data);
+               ret = channel_forward(chn, bytes);
+               b_set_data(&chn->buf, b_size(&chn->buf));
+       }
        return ret;
 }
 
 
 static inline void channel_htx_forward_forever(struct channel *chn, struct htx *htx)
 {
-       b_set_data(&chn->buf, htx->data);
-       channel_forward_forever(chn);
-       b_set_data(&chn->buf, b_size(&chn->buf));
+       c_adv(chn, htx->data - co_data(chn));
+       chn->to_forward = CHN_INFINITE_FORWARD;
 }
 /*********************************************************************/
 /* These functions are used to compute various channel content sizes */