Mercurial > hg > nginx
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; }