]> git.kaiwu.me - nginx.git/commitdiff
QUIC: do not resend empty queue when speeding up handshake.
authorSergey Kandaurov <pluknet@nginx.com>
Mon, 5 Oct 2020 12:02:53 +0000 (13:02 +0100)
committerSergey Kandaurov <pluknet@nginx.com>
Mon, 5 Oct 2020 12:02:53 +0000 (13:02 +0100)
If client acknowledged an Initial packet with CRYPTO frame and then
sent another Initial packet containing duplicate CRYPTO again, this
could result in resending frames off the empty send queue.

src/event/ngx_event_quic.c

index 0c32be355365cd8d12ee658f6aed5ea9bee61e8f..f503c48babdb87c0d4fff5e5de1fed180f28c4eb 100644 (file)
@@ -2846,6 +2846,7 @@ ngx_quic_handle_crypto_frame(ngx_connection_t *c, ngx_quic_header_t *pkt,
 {
     uint64_t                   last;
     ngx_int_t                  rc;
+    ngx_quic_send_ctx_t       *ctx;
     ngx_quic_connection_t     *qc;
     ngx_quic_crypto_frame_t   *f;
     ngx_quic_frames_stream_t  *fs;
@@ -2871,7 +2872,11 @@ ngx_quic_handle_crypto_frame(ngx_connection_t *c, ngx_quic_header_t *pkt,
     /* speeding up handshake completion */
 
     if (pkt->level == ssl_encryption_initial) {
-        ngx_quic_resend_frames(c, ngx_quic_get_send_ctx(qc, pkt->level));
+        ctx = ngx_quic_get_send_ctx(qc, pkt->level);
+
+        if (!ngx_queue_empty(&ctx->sent)) {
+            ngx_quic_resend_frames(c, ctx);
+        }
     }
 
     return NGX_OK;