From a4f9dd4a56420f547c1fa1bd6ff3e88735671ab6 Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Wed, 29 May 2019 14:52:56 +0200 Subject: [PATCH] BUG/MINOR: channel/htx: Don't alter channel during forward for empty HTX message 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 | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/include/proto/channel.h b/include/proto/channel.h index d192c9b28..563ad1e24 100644 --- a/include/proto/channel.h +++ b/include/proto/channel.h @@ -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 */ -- 2.47.3