]> git.kaiwu.me - nginx.git/commitdiff
QUIC: fixed insertion at the end of buffer.
authorRoman Arutyunyan <arut@nginx.com>
Thu, 17 Feb 2022 19:38:42 +0000 (22:38 +0300)
committerRoman Arutyunyan <arut@nginx.com>
Thu, 17 Feb 2022 19:38:42 +0000 (22:38 +0300)
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.

src/event/quic/ngx_event_quic.h
src/event/quic/ngx_event_quic_frames.c

index 109cd54ef12a2316d5991872045e2ff87e6ed6e2..903b690b953fc3e23906f981c7428f4621796bcd 100644 (file)
@@ -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;
 
 
index 5ffae32c30beead500988c5a795e1c91ad388446..9a1a6afe52881f73a8d8a87ba0e540b015e97f30 100644 (file)
@@ -503,7 +503,7 @@ ngx_quic_write_buffer(ngx_connection_t *c, ngx_quic_buffer_t *qb,
 
     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 *c, ngx_quic_buffer_t *qb,
     }
 
     qb->last_offset = base;
-    qb->last_chain = chain;
+    qb->last_chain = *chain;
 
     return in;
 }