Router: fixed nxt_http_route_arguments_parse().
A valid query string argument is a string of "key=value\[&key=value ...\]" pairs with non-empty keys. The fix removes invalid empty arguments.
This commit is contained in:
@@ -2025,10 +2025,9 @@ static nxt_array_t *
|
|||||||
nxt_http_route_arguments_parse(nxt_http_request_t *r)
|
nxt_http_route_arguments_parse(nxt_http_request_t *r)
|
||||||
{
|
{
|
||||||
size_t name_length;
|
size_t name_length;
|
||||||
u_char c, *p, *dst, *dst_start, *start, *end, *name;
|
u_char *p, *dst, *dst_start, *start, *end, *name;
|
||||||
uint8_t d0, d1;
|
uint8_t d0, d1;
|
||||||
uint32_t hash;
|
uint32_t hash;
|
||||||
nxt_bool_t valid;
|
|
||||||
nxt_array_t *args;
|
nxt_array_t *args;
|
||||||
nxt_http_name_value_t *nv;
|
nxt_http_name_value_t *nv;
|
||||||
|
|
||||||
@@ -2042,7 +2041,6 @@ nxt_http_route_arguments_parse(nxt_http_request_t *r)
|
|||||||
}
|
}
|
||||||
|
|
||||||
hash = NXT_HTTP_FIELD_HASH_INIT;
|
hash = NXT_HTTP_FIELD_HASH_INIT;
|
||||||
valid = 1;
|
|
||||||
name = NULL;
|
name = NULL;
|
||||||
name_length = 0;
|
name_length = 0;
|
||||||
|
|
||||||
@@ -2055,24 +2053,20 @@ nxt_http_route_arguments_parse(nxt_http_request_t *r)
|
|||||||
end = start + r->args->length;
|
end = start + r->args->length;
|
||||||
|
|
||||||
for (p = start, dst = dst_start; p < end; p++, dst++) {
|
for (p = start, dst = dst_start; p < end; p++, dst++) {
|
||||||
c = *p;
|
*dst = *p;
|
||||||
*dst = c;
|
|
||||||
|
|
||||||
switch (c) {
|
switch (*p) {
|
||||||
case '=':
|
case '=':
|
||||||
if (name != NULL) {
|
if (name == NULL) {
|
||||||
break;
|
name_length = dst - dst_start;
|
||||||
|
name = dst_start;
|
||||||
|
dst_start = dst + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
name_length = dst - dst_start;
|
|
||||||
valid = (name_length != 0);
|
|
||||||
name = dst_start;
|
|
||||||
dst_start = dst + 1;
|
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
case '&':
|
case '&':
|
||||||
if (valid) {
|
if (name_length != 0 || dst != dst_start) {
|
||||||
nv = nxt_http_route_argument(args, name, name_length, hash,
|
nv = nxt_http_route_argument(args, name, name_length, hash,
|
||||||
dst_start, dst);
|
dst_start, dst);
|
||||||
if (nxt_slow_path(nv == NULL)) {
|
if (nxt_slow_path(nv == NULL)) {
|
||||||
@@ -2082,14 +2076,12 @@ nxt_http_route_arguments_parse(nxt_http_request_t *r)
|
|||||||
|
|
||||||
hash = NXT_HTTP_FIELD_HASH_INIT;
|
hash = NXT_HTTP_FIELD_HASH_INIT;
|
||||||
name_length = 0;
|
name_length = 0;
|
||||||
valid = 1;
|
|
||||||
name = NULL;
|
name = NULL;
|
||||||
dst_start = dst + 1;
|
dst_start = dst + 1;
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
case '+':
|
case '+':
|
||||||
c = ' ';
|
|
||||||
*dst = ' ';
|
*dst = ' ';
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -2107,18 +2099,17 @@ nxt_http_route_arguments_parse(nxt_http_request_t *r)
|
|||||||
}
|
}
|
||||||
|
|
||||||
p += 2;
|
p += 2;
|
||||||
c = (d0 << 4) + d1;
|
*dst = (d0 << 4) + d1;
|
||||||
*dst = c;
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (name == NULL) {
|
if (name == NULL) {
|
||||||
hash = nxt_http_field_hash_char(hash, c);
|
hash = nxt_http_field_hash_char(hash, *dst);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (valid) {
|
if (name_length != 0 || dst != dst_start) {
|
||||||
nv = nxt_http_route_argument(args, name, name_length, hash, dst_start,
|
nv = nxt_http_route_argument(args, name, name_length, hash, dst_start,
|
||||||
dst);
|
dst);
|
||||||
if (nxt_slow_path(nv == NULL)) {
|
if (nxt_slow_path(nv == NULL)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user