From 71c486b290d49a0d278fc7f822dd451c31aaf144 Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Thu, 9 Feb 2023 14:14:38 +0100 Subject: [PATCH] BUG/MEDIUM: stconn: Don't needlessly wake the stream on send during fast-forward With a connection, when data are received, if these data are sent to the opposite side because the fast-forwarding is possible, the stream may be woken up on some conditions (at the end of sc_app_chk_snd_conn()): * The channel is shut for write * The SC is not in the "established" state * The stream must explicitly be woken up on write and all data was sent * The connection was just established. A bug on the last condition was introduced with the commit d89884153 ("MEDIUM: channel: Use CF_WRITE_EVENT instead of CF_WRITE_PARTIAL"). The stream is now woken up on any write events. This patch fixes this issue and restores the original behavior. No backport is needed. --- src/stconn.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/stconn.c b/src/stconn.c index 48c5a50..9dfd77c 100644 --- a/src/stconn.c +++ b/src/stconn.c @@ -870,10 +870,11 @@ static void sc_app_chk_snd_conn(struct stconn *sc) /* in case of special condition (error, shutdown, end of write...), we * have to notify the task. */ - if (likely((oc->flags & (CF_WRITE_EVENT|CF_SHUTW)) || - ((oc->flags & CF_WAKE_WRITE) && - ((channel_is_empty(oc) && !oc->to_forward) || - !sc_state_in(sc->state, SC_SB_EST))))) { + if (likely((oc->flags & CF_SHUTW) || + ((oc->flags & CF_WRITE_EVENT) && sc->state < SC_ST_EST) || + ((oc->flags & CF_WAKE_WRITE) && + ((channel_is_empty(oc) && !oc->to_forward) || + !sc_state_in(sc->state, SC_SB_EST))))) { out_wakeup: if (!(sc->flags & SC_FL_DONT_WAKE)) task_wakeup(sc_strm_task(sc), TASK_WOKEN_IO); -- 1.7.10.4