changeset 8455:b0e81f49d7c0 quic

HTTP/3: fixed prefixed integer encoding and decoding. Previously bytes were ordered from MSB to LSB, but the right order is the reverse.
author Roman Arutyunyan <arut@nginx.com>
date Thu, 02 Jul 2020 15:15:55 +0300
parents 032cb35ce758
children c9538aef3211
files src/http/v3/ngx_http_v3.c src/http/v3/ngx_http_v3_parse.c src/http/v3/ngx_http_v3_parse.h
diffstat 3 files changed, 16 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/src/http/v3/ngx_http_v3.c
+++ b/src/http/v3/ngx_http_v3.c
@@ -78,23 +78,22 @@ ngx_http_v3_encode_prefix_int(u_char *p,
 
     value -= thresh;
 
-    for (n = 10; n > 1; n--) {
-        if (value >> (7 * (n - 1))) {
-            break;
+    if (p == NULL) {
+        for (n = 2; value >= 128; n++) {
+            value >>= 7;
         }
-    }
 
-    if (p == NULL) {
-        return n + 1;
+        return n;
     }
 
     *p++ |= thresh;
 
-    for ( /* void */ ; n > 1; n--) {
-        *p++ = 0x80 | (value >> 7 * (n - 1));
+    while (value >= 128) {
+        *p++ = 0x80 | value;
+        value >>= 7;
     }
 
-    *p++ = value & 0x7f;
+    *p++ = value;
 
     return (uintptr_t) p;
 }
--- a/src/http/v3/ngx_http_v3_parse.c
+++ b/src/http/v3/ngx_http_v3_parse.c
@@ -91,6 +91,7 @@ ngx_int_t
 ngx_http_v3_parse_prefix_int(ngx_connection_t *c,
     ngx_http_v3_parse_prefix_int_t *st, ngx_uint_t prefix, u_char ch)
 {
+    ngx_uint_t  mask;
     enum {
         sw_start = 0,
         sw_value
@@ -100,25 +101,25 @@ ngx_http_v3_parse_prefix_int(ngx_connect
 
     case sw_start:
 
-        st->mask = (1 << prefix) - 1;
-        st->value = (ch & st->mask);
+        mask = (1 << prefix) - 1;
+        st->value = ch & mask;
 
-        if (st->value != st->mask) {
+        if (st->value != mask) {
             goto done;
         }
 
-        st->value = 0;
+        st->shift = 0;
         st->state = sw_value;
         break;
 
     case sw_value:
 
-        st->value = (st->value << 7) + (ch & 0x7f);
+        st->value += (ch & 0x7f) << st->shift;
         if (ch & 0x80) {
+            st->shift += 7;
             break;
         }
 
-        st->value += st->mask;
         goto done;
     }
 
--- a/src/http/v3/ngx_http_v3_parse.h
+++ b/src/http/v3/ngx_http_v3_parse.h
@@ -22,7 +22,7 @@ typedef struct {
 
 typedef struct {
     ngx_uint_t                      state;
-    ngx_uint_t                      mask;
+    ngx_uint_t                      shift;
     uint64_t                        value;
 } ngx_http_v3_parse_prefix_int_t;