aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladimir Khomutov <vl@wbsrv.ru>2024-04-10 09:38:10 +0300
committerVladimir Khomutov <vl@wbsrv.ru>2024-04-10 09:38:10 +0300
commit92f99685717e857de9ffa96993601a90803eb0d8 (patch)
treec0091d8a88b05a6c1dae8f035328100ff6af3ef3
parente3207a17f084c9eb7905ca0f2cfdb1df088fd165 (diff)
downloadnginx-92f99685717e857de9ffa96993601a90803eb0d8.tar.gz
nginx-92f99685717e857de9ffa96993601a90803eb0d8.zip
QUIC: fixed close timer processing with early data.
The ngx_quic_run() function uses qc->close timer to limit the handshake duration. Normally it is removed by ngx_quic_do_init_streams() which is called once when we are done with initial SSL processing. The problem happens when the client sends early data and streams are initialized in the ngx_quic_run() -> ngx_quic_handle_datagram() call. The order of set/remove timer calls is now reversed; the close timer is set up and the timer fires when assigned, starting the unexpected connection close process. The fix is to skip setting the timer if streams were initialized during handling of the initial datagram. The idle timer for quic is set anyway, and stream-related timeouts are managed by application layer.
-rw-r--r--src/event/quic/ngx_event_quic.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/event/quic/ngx_event_quic.c b/src/event/quic/ngx_event_quic.c
index 4687c849e..e4690f7dd 100644
--- a/src/event/quic/ngx_event_quic.c
+++ b/src/event/quic/ngx_event_quic.c
@@ -211,7 +211,10 @@ ngx_quic_run(ngx_connection_t *c, ngx_quic_conf_t *conf)
qc = ngx_quic_get_connection(c);
ngx_add_timer(c->read, qc->tp.max_idle_timeout);
- ngx_add_timer(&qc->close, qc->conf->handshake_timeout);
+
+ if (!qc->streams.initialized) {
+ ngx_add_timer(&qc->close, qc->conf->handshake_timeout);
+ }
ngx_quic_connstate_dbg(c);