diff src/event/quic/ngx_event_quic_transport.c @ 9072:def8e398d7c5 quic

QUIC: fixed broken token in NEW_TOKEN (ticket #2446). Previously, since 3550b00d9dc8, the token was allocated on stack, to get rid of pool usage. Now the token is allocated by ngx_quic_copy_buffer() in QUIC buffers, also used for STREAM, CRYPTO and ACK frames.
author Roman Arutyunyan <arut@nginx.com>
date Tue, 31 Jan 2023 15:26:33 +0400
parents a26897674420
children efd91f6afa8d
line wrap: on
line diff
--- a/src/event/quic/ngx_event_quic_transport.c	Tue Jan 31 14:12:18 2023 +0400
+++ b/src/event/quic/ngx_event_quic_transport.c	Tue Jan 31 15:26:33 2023 +0400
@@ -109,7 +109,7 @@
     ngx_quic_crypto_frame_t *crypto, ngx_chain_t *data);
 static size_t ngx_quic_create_hs_done(u_char *p);
 static size_t ngx_quic_create_new_token(u_char *p,
-    ngx_quic_new_token_frame_t *token);
+    ngx_quic_new_token_frame_t *token, ngx_chain_t *data);
 static size_t ngx_quic_create_stream(u_char *p, ngx_quic_stream_frame_t *sf,
     ngx_chain_t *data);
 static size_t ngx_quic_create_max_streams(u_char *p,
@@ -1301,7 +1301,7 @@
         return ngx_quic_create_hs_done(p);
 
     case NGX_QUIC_FT_NEW_TOKEN:
-        return ngx_quic_create_new_token(p, &f->u.token);
+        return ngx_quic_create_new_token(p, &f->u.token, f->data);
 
     case NGX_QUIC_FT_STREAM:
         return ngx_quic_create_stream(p, &f->u.stream, f->data);
@@ -1491,10 +1491,12 @@
 
 
 static size_t
-ngx_quic_create_new_token(u_char *p, ngx_quic_new_token_frame_t *token)
+ngx_quic_create_new_token(u_char *p, ngx_quic_new_token_frame_t *token,
+    ngx_chain_t *data)
 {
-    size_t   len;
-    u_char  *start;
+    size_t      len;
+    u_char     *start;
+    ngx_buf_t  *b;
 
     if (p == NULL) {
         len = ngx_quic_varint_len(NGX_QUIC_FT_NEW_TOKEN);
@@ -1508,7 +1510,12 @@
 
     ngx_quic_build_int(&p, NGX_QUIC_FT_NEW_TOKEN);
     ngx_quic_build_int(&p, token->length);
-    p = ngx_cpymem(p, token->data, token->length);
+
+    while (data) {
+        b = data->buf;
+        p = ngx_cpymem(p, b->pos, b->last - b->pos);
+        data = data->next;
+    }
 
     return p - start;
 }