]> git.kaiwu.me - nginx.git/commitdiff
Discarding Handshake packets if no Handshake keys yet.
authorSergey Kandaurov <pluknet@nginx.com>
Mon, 6 Apr 2020 11:54:10 +0000 (14:54 +0300)
committerSergey Kandaurov <pluknet@nginx.com>
Mon, 6 Apr 2020 11:54:10 +0000 (14:54 +0300)
Found with a previously received Initial packet with ACK only, which
instantiates a new connection but do not produce the handshake keys.

This can be triggered by a fairly well behaving client, if the server
stands behind a load balancer that stripped Initial packets exchange.

Found by F5 test suite.

src/event/ngx_event_quic.c

index b96af808d4eae0d064ce85d27d14bafd5dfefaa0..ab0cf2cd75d32d9a926cc1a891cf09e8844177c1 100644 (file)
@@ -870,6 +870,14 @@ ngx_quic_handshake_input(ngx_connection_t *c, ngx_quic_header_t *pkt)
 
     qc = c->quic;
 
+    keys = &c->quic->keys[ssl_encryption_handshake];
+
+    if (keys->client.key.len == 0) {
+        ngx_log_error(NGX_LOG_INFO, c->log, 0,
+                      "no read keys yet, packet ignored");
+        return NGX_DECLINED;
+    }
+
     /* extract cleartext data into pkt */
     if (ngx_quic_parse_long_header(pkt) != NGX_OK) {
         return NGX_ERROR;
@@ -905,8 +913,6 @@ ngx_quic_handshake_input(ngx_connection_t *c, ngx_quic_header_t *pkt)
         return NGX_ERROR;
     }
 
-    keys = &c->quic->keys[ssl_encryption_handshake];
-
     pkt->secret = &keys->client;
     pkt->level = ssl_encryption_handshake;
     pkt->plaintext = buf;