]> git.kaiwu.me - nginx.git/commitdiff
QUIC: fixed split frames error handling.
authorSergey Kandaurov <pluknet@nginx.com>
Thu, 4 May 2023 11:52:23 +0000 (15:52 +0400)
committerSergey Kandaurov <pluknet@nginx.com>
Thu, 4 May 2023 11:52:23 +0000 (15:52 +0400)
Do not corrupt frame data chain pointer on ngx_quic_read_buffer() error.
The error leads to closing a QUIC connection where the frame may be used
as part of the QUIC connection tear down, which envolves writing pending
frames, including this one.

src/event/quic/ngx_event_quic_frames.c

index 040b6182ccfea6e36350192a6dbe2abcce01022b..7bcfb32112601da8ccf91aba65819c743b6c6c7e 100644 (file)
@@ -319,6 +319,7 @@ ngx_int_t
 ngx_quic_split_frame(ngx_connection_t *c, ngx_quic_frame_t *f, size_t len)
 {
     size_t                     shrink;
+    ngx_chain_t               *out;
     ngx_quic_frame_t          *nf;
     ngx_quic_buffer_t          qb;
     ngx_quic_ordered_frame_t  *of, *onf;
@@ -359,11 +360,13 @@ ngx_quic_split_frame(ngx_connection_t *c, ngx_quic_frame_t *f, size_t len)
     ngx_memzero(&qb, sizeof(ngx_quic_buffer_t));
     qb.chain = f->data;
 
-    f->data = ngx_quic_read_buffer(c, &qb, of->length);
-    if (f->data == NGX_CHAIN_ERROR) {
+    out = ngx_quic_read_buffer(c, &qb, of->length);
+    if (out == NGX_CHAIN_ERROR) {
         return NGX_ERROR;
     }
 
+    f->data = out;
+
     nf = ngx_quic_alloc_frame(c);
     if (nf == NULL) {
         return NGX_ERROR;