# HG changeset patch # User Roman Arutyunyan # Date 1593692155 -10800 # Node ID b0e81f49d7c0f202ffe23f036b5ab7ca64cd294a # Parent 032cb35ce758ae02266b6b97c216225b7d81ab91 HTTP/3: fixed prefixed integer encoding and decoding. Previously bytes were ordered from MSB to LSB, but the right order is the reverse. diff --git a/src/http/v3/ngx_http_v3.c b/src/http/v3/ngx_http_v3.c --- 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; } diff --git a/src/http/v3/ngx_http_v3_parse.c b/src/http/v3/ngx_http_v3_parse.c --- 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; } diff --git a/src/http/v3/ngx_http_v3_parse.h b/src/http/v3/ngx_http_v3_parse.h --- 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;