]> git.kaiwu.me - nginx.git/commitdiff
QUIC: keep the entire packet size in pkt->len.
authorRoman Arutyunyan <arut@nginx.com>
Fri, 25 Sep 2020 18:46:55 +0000 (21:46 +0300)
committerRoman Arutyunyan <arut@nginx.com>
Fri, 25 Sep 2020 18:46:55 +0000 (21:46 +0300)
Previously pkt->len kept the length of the packet remainder starting from
pkt->raw->pos.

src/event/ngx_event_quic.c
src/event/ngx_event_quic_protection.c
src/event/ngx_event_quic_transport.c

index f8e449517c17e544eef8f4a5f1726a92e7bff110..f79ec408f918842edc651f5338065e07b261dd07 100644 (file)
@@ -1676,7 +1676,7 @@ ngx_quic_input(ngx_connection_t *c, ngx_buf_t *b)
          */
 
         /* b->pos is at header end, adjust by actual packet length */
-        b->pos += pkt.len;
+        b->pos = pkt.data + pkt.len;
         p = ngx_quic_skip_zero_padding(b);
     }
 
index 0d205a1601e0ab0852b09a59c8e1d9b5fd491e30..2f686cd7e12d26fe703a694c05038096cefb3a64 100644 (file)
@@ -997,6 +997,7 @@ ngx_quic_decrypt(ngx_quic_header_t *pkt, ngx_ssl_conn_t *ssl_conn,
     uint64_t *largest_pn)
 {
     u_char               clearflags, *p, *sample;
+    size_t               len;
     uint8_t              badflags;
     uint64_t             pn, lpn;
     ngx_int_t            pnl, rc, key_phase;
@@ -1012,6 +1013,7 @@ ngx_quic_decrypt(ngx_quic_header_t *pkt, ngx_ssl_conn_t *ssl_conn,
     secret = pkt->secret;
 
     p = pkt->raw->pos;
+    len = pkt->data + pkt->len - p;
 
     /* draft-ietf-quic-tls-23#section-5.4.2:
      * the Packet Number field is assumed to be 4 bytes long
@@ -1019,7 +1021,7 @@ ngx_quic_decrypt(ngx_quic_header_t *pkt, ngx_ssl_conn_t *ssl_conn,
      * AES-Based and ChaCha20-Based header protections sample 16 bytes
      */
 
-    if (pkt->len < EVP_GCM_TLS_TAG_LEN + 4) {
+    if (len < EVP_GCM_TLS_TAG_LEN + 4) {
         return NGX_DECLINED;
     }
 
@@ -1062,7 +1064,7 @@ ngx_quic_decrypt(ngx_quic_header_t *pkt, ngx_ssl_conn_t *ssl_conn,
     /* packet protection */
 
     in.data = p;
-    in.len = pkt->len - pnl;
+    in.len = len - pnl;
 
     if (ngx_quic_long_pkt(pkt->flags)) {
         badflags = clearflags & NGX_QUIC_PKT_LONG_RESERVED_BIT;
index 1d270a2f2703da462782b54bc0069003d5f79ad2..be0aed78ddadb8e0ea0239302eb884672687eab1 100644 (file)
@@ -511,7 +511,6 @@ ngx_quic_parse_short_header(ngx_quic_header_t *pkt, ngx_str_t *dcid)
     }
 
     pkt->raw->pos = p;
-    pkt->len = end - p;
 
     return NGX_OK;
 }
@@ -561,7 +560,7 @@ ngx_quic_parse_initial_header(ngx_quic_header_t *pkt)
     }
 
     pkt->raw->pos = p;
-    pkt->len = varint;
+    pkt->len = p + varint - pkt->data;
 
 #ifdef NGX_QUIC_DEBUG_PACKETS
     ngx_quic_hexdump(pkt->log, "quic DCID", pkt->dcid.data, pkt->dcid.len);
@@ -600,7 +599,7 @@ ngx_quic_parse_handshake_header(ngx_quic_header_t *pkt)
     }
 
     pkt->raw->pos = p;
-    pkt->len = plen;
+    pkt->len = p + plen - pkt->data;
 
     return NGX_OK;
 }