summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorZhidao HONG <z.hong@f5.com>2021-11-05 11:10:03 +0800
committerZhidao HONG <z.hong@f5.com>2021-11-05 11:10:03 +0800
commit40ad333a9c938f73621af0f32b0f09ab634c26c0 (patch)
tree36a2e438199a3ca1f7d9ef28f5e0feb778931681
parent85ab3f5ab53146a5db463d4aae86e8b6de71965c (diff)
downloadunit-40ad333a9c938f73621af0f32b0f09ab634c26c0.tar.gz
unit-40ad333a9c938f73621af0f32b0f09ab634c26c0.tar.bz2
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.
-rw-r--r--src/nxt_http_route.c31
1 files changed, 11 insertions, 20 deletions
diff --git a/src/nxt_http_route.c b/src/nxt_http_route.c
index 328a32c6..ad2129e7 100644
--- a/src/nxt_http_route.c
+++ b/src/nxt_http_route.c
@@ -2025,10 +2025,9 @@ static nxt_array_t *
nxt_http_route_arguments_parse(nxt_http_request_t *r)
{
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;
uint32_t hash;
- nxt_bool_t valid;
nxt_array_t *args;
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;
- valid = 1;
name = NULL;
name_length = 0;
@@ -2055,24 +2053,20 @@ nxt_http_route_arguments_parse(nxt_http_request_t *r)
end = start + r->args->length;
for (p = start, dst = dst_start; p < end; p++, dst++) {
- c = *p;
- *dst = c;
+ *dst = *p;
- switch (c) {
+ switch (*p) {
case '=':
- if (name != NULL) {
- break;
+ if (name == NULL) {
+ 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;
case '&':
- if (valid) {
+ if (name_length != 0 || dst != dst_start) {
nv = nxt_http_route_argument(args, name, name_length, hash,
dst_start, dst);
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;
name_length = 0;
- valid = 1;
name = NULL;
dst_start = dst + 1;
continue;
case '+':
- c = ' ';
*dst = ' ';
break;
@@ -2107,18 +2099,17 @@ nxt_http_route_arguments_parse(nxt_http_request_t *r)
}
p += 2;
- c = (d0 << 4) + d1;
- *dst = c;
+ *dst = (d0 << 4) + d1;
break;
}
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,
dst);
if (nxt_slow_path(nv == NULL)) {