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.
diff --git a/include/proto/channel.h b/include/proto/channel.h
index d192c9b..563ad1e 100644
--- a/include/proto/channel.h
+++ b/include/proto/channel.h
@@ -383,20 +383,21 @@
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 */