aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/http/v3/ngx_http_v3.c17
-rw-r--r--src/http/v3/ngx_http_v3_parse.c13
-rw-r--r--src/http/v3/ngx_http_v3_parse.h2
3 files changed, 16 insertions, 16 deletions
diff --git a/src/http/v3/ngx_http_v3.c b/src/http/v3/ngx_http_v3.c
index f7f79b9f4..e796da772 100644
--- 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, uint64_t value, ngx_uint_t prefix)
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
index 71a643d70..85491082e 100644
--- 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_connection_t *c,
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
index ec78c7c35..17ff6c777 100644
--- 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;