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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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}")
|
||||||
|
|||||||
Reference in New Issue
Block a user