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.
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 @@
/* 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);