Mercurial > hg > nginx
changeset 9016:55b38514729b quic
QUIC: fixed insertion at the end of buffer.
Previously, last buffer was tracked by keeping a pointer to the previous
chain link "next" field. When the previous buffer was split and then removed,
the pointer was no longer valid. Writing at this pointer resulted in broken
data chains.
Now last buffer is tracked by keeping a direct pointer to it.
author | Roman Arutyunyan <arut@nginx.com> |
---|---|
date | Thu, 17 Feb 2022 22:38:42 +0300 |
parents | a2fbae359828 |
children | c2f5d79cde64 |
files | src/event/quic/ngx_event_quic.h src/event/quic/ngx_event_quic_frames.c |
diffstat | 2 files changed, 3 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/event/quic/ngx_event_quic.h Wed Feb 16 15:45:47 2022 +0300 +++ b/src/event/quic/ngx_event_quic.h Thu Feb 17 22:38:42 2022 +0300 @@ -53,7 +53,7 @@ uint64_t offset; uint64_t last_offset; ngx_chain_t *chain; - ngx_chain_t **last_chain; + ngx_chain_t *last_chain; } ngx_quic_buffer_t;
--- a/src/event/quic/ngx_event_quic_frames.c Wed Feb 16 15:45:47 2022 +0300 +++ b/src/event/quic/ngx_event_quic_frames.c Thu Feb 17 22:38:42 2022 +0300 @@ -503,7 +503,7 @@ if (qb->last_chain && offset >= qb->last_offset) { base = qb->last_offset; - chain = qb->last_chain; + chain = &qb->last_chain; } else { base = qb->offset; @@ -600,7 +600,7 @@ } qb->last_offset = base; - qb->last_chain = chain; + qb->last_chain = *chain; return in; }