aboutsummaryrefslogtreecommitdiff
path: root/src/http/ngx_http_script.c
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2008-02-12 18:05:32 +0000
committerIgor Sysoev <igor@sysoev.ru>2008-02-12 18:05:32 +0000
commit04610ead82aee661d07534dae1836b8566a49794 (patch)
tree75bdd63f8ae9b8cb4086500714b00179fd7943c7 /src/http/ngx_http_script.c
parent2a6c4466eee1a380333777be4f24059b8352a99c (diff)
downloadnginx-04610ead82aee661d07534dae1836b8566a49794.tar.gz
nginx-04610ead82aee661d07534dae1836b8566a49794.zip
length calculation did not take into account escaped symbols in arguments
Diffstat (limited to 'src/http/ngx_http_script.c')
-rw-r--r--src/http/ngx_http_script.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/src/http/ngx_http_script.c b/src/http/ngx_http_script.c
index 0af34e32f..acd867fdb 100644
--- a/src/http/ngx_http_script.c
+++ b/src/http/ngx_http_script.c
@@ -221,6 +221,14 @@ ngx_http_script_compile(ngx_http_script_compile_t *sc)
sc->args = 1;
sc->compile_args = 0;
+ code = ngx_http_script_add_code(*sc->lengths, sizeof(uintptr_t),
+ NULL);
+ if (code == NULL) {
+ return NGX_ERROR;
+ }
+
+ *code = (uintptr_t) ngx_http_script_mark_args_code;
+
code = ngx_http_script_add_code(*sc->values, sizeof(uintptr_t),
&sc->main);
if (code == NULL) {
@@ -504,7 +512,7 @@ ngx_http_script_copy_capture_len_code(ngx_http_script_engine_t *e)
e->ip += sizeof(ngx_http_script_copy_capture_code_t);
if (code->n < e->ncaptures) {
- if ((e->args || e->quote)
+ if ((e->is_args || e->quote)
&& (e->request->quoted_uri || e->request->plus_in_uri))
{
return e->captures[code->n + 1] - e->captures[code->n]
@@ -531,7 +539,7 @@ ngx_http_script_copy_capture_code(ngx_http_script_engine_t *e)
e->ip += sizeof(ngx_http_script_copy_capture_code_t);
if (code->n < e->ncaptures) {
- if ((e->args || e->quote)
+ if ((e->is_args || e->quote)
&& (e->request->quoted_uri || e->request->plus_in_uri))
{
e->pos = (u_char *) ngx_escape_uri(e->pos,
@@ -550,6 +558,16 @@ ngx_http_script_copy_capture_code(ngx_http_script_engine_t *e)
}
+size_t
+ngx_http_script_mark_args_code(ngx_http_script_engine_t *e)
+{
+ e->is_args = 1;
+ e->ip += sizeof(uintptr_t);
+
+ return 1;
+}
+
+
void
ngx_http_script_start_args_code(ngx_http_script_engine_t *e)
{
@@ -700,7 +718,7 @@ ngx_http_script_regex_start_code(ngx_http_script_engine_t *e)
le.ncaptures = e->ncaptures;
le.quote = code->redirect;
- len = 1; /* reserve 1 byte for possible "?" */
+ len = 0;
while (*(uintptr_t *) le.ip) {
lcode = *(ngx_http_script_len_code_pt *) le.ip;
@@ -708,6 +726,7 @@ ngx_http_script_regex_start_code(ngx_http_script_engine_t *e)
}
e->buf.len = len;
+ e->is_args = le.is_args;
}
if (code->add_args && r->args.len) {