Mercurial > hg > nginx-quic
changeset 7950: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; }