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
+++ b/src/event/quic/ngx_event_quic.h
@@ -53,7 +53,7 @@ typedef struct {
     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
+++ b/src/event/quic/ngx_event_quic_frames.c
@@ -503,7 +503,7 @@ ngx_quic_write_buffer(ngx_connection_t *
 
     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 @@ ngx_quic_write_buffer(ngx_connection_t *
     }
 
     qb->last_offset = base;
-    qb->last_chain = chain;
+    qb->last_chain = *chain;
 
     return in;
 }