Var: improved variable parsing with empty names.

Unit parsed the case of "$uri$$host" into unknown variables.
This commit makes it invalid variable instead.
This commit is contained in:
Zhidao HONG
2022-11-20 23:11:41 +08:00
parent 894a2620a7
commit 3711632c00
2 changed files with 34 additions and 44 deletions

View File

@@ -61,8 +61,7 @@ static nxt_int_t nxt_var_cache_test(nxt_lvlhsh_query_t *lhq, void *data);
static nxt_str_t *nxt_var_cache_value(nxt_task_t *task, nxt_var_query_t *query, static nxt_str_t *nxt_var_cache_value(nxt_task_t *task, nxt_var_query_t *query,
uint32_t index); uint32_t index);
static u_char *nxt_var_next_part(u_char *start, size_t length, nxt_str_t *part, static u_char *nxt_var_next_part(u_char *start, u_char *end, nxt_str_t *part);
nxt_bool_t *is_var);
static const nxt_lvlhsh_proto_t nxt_var_hash_proto nxt_aligned(64) = { static const nxt_lvlhsh_proto_t nxt_var_hash_proto nxt_aligned(64) = {
@@ -340,7 +339,6 @@ nxt_var_compile(nxt_str_t *str, nxt_mp_t *mp, nxt_array_t *fields,
nxt_var_t *var; nxt_var_t *var;
nxt_str_t part; nxt_str_t part;
nxt_uint_t n; nxt_uint_t n;
nxt_bool_t is_var;
nxt_var_sub_t *subs; nxt_var_sub_t *subs;
nxt_var_decl_t *decl; nxt_var_decl_t *decl;
@@ -352,12 +350,12 @@ nxt_var_compile(nxt_str_t *str, nxt_mp_t *mp, nxt_array_t *fields,
end = p + str->length; end = p + str->length;
while (p < end) { while (p < end) {
p = nxt_var_next_part(p, end - p, &part, &is_var); p = nxt_var_next_part(p, end, &part);
if (nxt_slow_path(p == NULL)) { if (nxt_slow_path(p == NULL)) {
return NULL; return NULL;
} }
if (is_var) { if (part.start != NULL) {
n++; n++;
} }
} }
@@ -386,9 +384,9 @@ nxt_var_compile(nxt_str_t *str, nxt_mp_t *mp, nxt_array_t *fields,
p = str->start; p = str->start;
while (p < end) { while (p < end) {
next = nxt_var_next_part(p, end - p, &part, &is_var); next = nxt_var_next_part(p, end, &part);
if (is_var) { if (part.start != NULL) {
decl = nxt_var_decl_get(&part, fields, &index); decl = nxt_var_decl_get(&part, fields, &index);
if (nxt_slow_path(decl == NULL)) { if (nxt_slow_path(decl == NULL)) {
return NULL; return NULL;
@@ -413,14 +411,13 @@ nxt_var_test(nxt_str_t *str, nxt_array_t *fields, u_char *error)
{ {
u_char *p, *end, *next; u_char *p, *end, *next;
nxt_str_t part; nxt_str_t part;
nxt_bool_t is_var;
nxt_var_decl_t *decl; nxt_var_decl_t *decl;
p = str->start; p = str->start;
end = p + str->length; end = p + str->length;
while (p < end) { while (p < end) {
next = nxt_var_next_part(p, end - p, &part, &is_var); next = nxt_var_next_part(p, end, &part);
if (next == NULL) { if (next == NULL) {
nxt_sprintf(error, error + NXT_MAX_ERROR_STR, nxt_sprintf(error, error + NXT_MAX_ERROR_STR,
@@ -429,7 +426,7 @@ nxt_var_test(nxt_str_t *str, nxt_array_t *fields, u_char *error)
return NXT_ERROR; return NXT_ERROR;
} }
if (is_var) { if (part.start != NULL) {
decl = nxt_var_decl_get(&part, fields, NULL); decl = nxt_var_decl_get(&part, fields, NULL);
if (decl == NULL) { if (decl == NULL) {
@@ -448,19 +445,15 @@ nxt_var_test(nxt_str_t *str, nxt_array_t *fields, u_char *error)
static u_char * static u_char *
nxt_var_next_part(u_char *start, size_t length, nxt_str_t *part, nxt_var_next_part(u_char *start, u_char *end, nxt_str_t *part)
nxt_bool_t *is_var)
{ {
u_char *p, *end, ch, c; size_t length;
u_char *p, ch, c;
nxt_bool_t bracket; nxt_bool_t bracket;
end = start + length; p = memchr(start, '$', end - start);
p = memchr(start, '$', length);
if (p == start) { if (p == start) {
*is_var = 1;
p++; p++;
if (p == end) { if (p == end) {
@@ -480,48 +473,44 @@ nxt_var_next_part(u_char *start, size_t length, nxt_str_t *part,
bracket = 0; bracket = 0;
} }
length = 0;
start = p; start = p;
for ( ;; ) { while (p < end) {
ch = *p; ch = *p;
c = (u_char) (ch | 0x20); c = (u_char) (ch | 0x20);
if ((c < 'a' || c > 'z') && ch != '_') {
if (bracket && ch != '}') {
return NULL;
}
break;
}
if ((c >= 'a' && c <= 'z') || ch == '_') {
p++; p++;
length++;
continue;
}
if (p == end) { if (bracket && ch == '}') {
if (bracket) { p++;
return NULL; bracket = 0;
} }
break; break;
} }
}
length = p - start; if (bracket || length == 0) {
end = p + bracket; return NULL;
} else {
*is_var = 0;
if (p != NULL) {
length = p - start;
end = p;
}
} }
part->length = length; part->length = length;
part->start = start; part->start = start;
return end; } else {
if (p == NULL) {
p = end;
}
nxt_str_null(part);
}
return p;
} }

View File

@@ -378,6 +378,7 @@ Connection: close
check_variables("${") check_variables("${")
check_variables("${}") check_variables("${}")
check_variables("$ur") check_variables("$ur")
check_variables("$uri$$host")
check_variables("$uriblah") check_variables("$uriblah")
check_variables("${uri") check_variables("${uri")
check_variables("${{uri}") check_variables("${{uri}")