]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: stream-int: Block reads if channel cannot receive more data
authorChristopher Faulet <cfaulet@haproxy.com>
Fri, 29 Oct 2021 12:55:59 +0000 (14:55 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Tue, 2 Nov 2021 15:55:01 +0000 (16:55 +0100)
First of all, we must be careful here because this part was modified and
each time, this introduced a bug. But, in si_update_rx(), we must not
re-enables receives if the channel buffer cannot receive more
data. Otherwise the multiplexer will be wake up for nothing. Because the
stream is woken up when the multiplexer is waiting for more room to move on,
this may lead to a ping-pong loop between the stream and the mux.

Note that for now, it does not fix any known bug. All reported issues in
this area were fixed in another way.

This patch must be backported with a special care. Technically speaking, it
may be backported as far as 2.0.

src/stream_interface.c

index b55515901c63dd9a598a712e00d7f52264c69825..8ad1854970f6fb86323720b8cbcf828ab79dc043 100644 (file)
@@ -838,7 +838,7 @@ void si_update_rx(struct stream_interface *si)
        else
                si_rx_chan_rdy(si);
 
-       if (!channel_is_empty(ic)) {
+       if (!channel_is_empty(ic) || !channel_may_recv(ic)) {
                /* stop reading, imposed by channel's policy or contents */
                si_rx_room_blk(si);
        }