QUIC: do not resend empty queue when speeding up handshake.

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.
This commit is contained in:
Sergey Kandaurov 2020-10-05 13:02:53 +01:00
parent 3309b1e8df
commit f09be89a52

View File

@ -2846,6 +2846,7 @@ ngx_quic_handle_crypto_frame(ngx_connection_t *c, ngx_quic_header_t *pkt,
{ {
uint64_t last; uint64_t last;
ngx_int_t rc; ngx_int_t rc;
ngx_quic_send_ctx_t *ctx;
ngx_quic_connection_t *qc; ngx_quic_connection_t *qc;
ngx_quic_crypto_frame_t *f; ngx_quic_crypto_frame_t *f;
ngx_quic_frames_stream_t *fs; 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 */ /* speeding up handshake completion */
if (pkt->level == ssl_encryption_initial) { 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; return NGX_OK;