From: Olivier Houchard Date: Thu, 23 Nov 2017 17:25:47 +0000 (+0100) Subject: MINOR: mux: Make sure every string is woken up after the handshake. X-Git-Tag: v1.8.0~50 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7fc96d5a01b85cd324faa57da7bfedbe52f96dfe;p=thirdparty%2Fhaproxy.git MINOR: mux: Make sure every string is woken up after the handshake. In case any stream was waiting for the handshake after receiving early data, we have to wake all of them. Do so by making the mux responsible for removing the CO_FL_EARLY_DATA flag after all of them are woken up, instead of doing it in si_cs_wake_cb(), which would then only work for the first one. This makes wait_for_handshake work with HTTP/2. --- diff --git a/src/mux_h2.c b/src/mux_h2.c index 57f1dfe0a9..43248f2cb4 100644 --- a/src/mux_h2.c +++ b/src/mux_h2.c @@ -2086,6 +2086,15 @@ static int h2_wake(struct connection *conn) { struct h2c *h2c = conn->mux_ctx; + /* + * If we received early data, try to wake any stream, just in case + * at least one of them was waiting for the handshake + */ + if ((conn->flags & (CO_FL_EARLY_SSL_HS | CO_FL_EARLY_DATA | CO_FL_HANDSHAKE)) == + CO_FL_EARLY_DATA) { + h2_wake_some_streams(h2c, 0, 0); + conn->flags &= ~CO_FL_EARLY_DATA; + } if (conn->flags & CO_FL_ERROR || conn_xprt_read0_pending(conn) || h2c->st0 == H2_CS_ERROR2 || h2c->flags & H2_CF_GOAWAY_FAILED || (eb_is_empty(&h2c->streams_by_id) && h2c->last_sid >= 0 && diff --git a/src/mux_pt.c b/src/mux_pt.c index cd3a28b42a..71bb477756 100644 --- a/src/mux_pt.c +++ b/src/mux_pt.c @@ -51,6 +51,12 @@ static int mux_pt_wake(struct connection *conn) ret = cs->data_cb->wake ? cs->data_cb->wake(cs) : 0; + /* If we had early data, and we're done with the handshake + * then whe know the data are safe, and we can remove the flag. + */ + if ((conn->flags & (CO_FL_EARLY_DATA | CO_FL_EARLY_SSL_HS | CO_FL_HANDSHAKE)) == + CO_FL_EARLY_DATA) + conn->flags &= ~CO_FL_EARLY_DATA; if (ret >= 0) cs_update_mux_polling(cs); return ret; diff --git a/src/stream_interface.c b/src/stream_interface.c index c2e3fffd48..6f9f27b98f 100644 --- a/src/stream_interface.c +++ b/src/stream_interface.c @@ -585,7 +585,6 @@ static int si_cs_wake_cb(struct conn_stream *cs) * the handshake. */ if ((conn->flags & (CO_FL_EARLY_DATA | CO_FL_EARLY_SSL_HS)) == CO_FL_EARLY_DATA) { - conn->flags &= ~CO_FL_EARLY_DATA; task_wakeup(si_task(si), TASK_WOKEN_MSG); }