Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nginx/nginx.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2005-10-10 16:59:41 +0400
committerIgor Sysoev <igor@sysoev.ru>2005-10-10 16:59:41 +0400
commit1bfa7bc78a23c0150e0bbf854e778dba4df30031 (patch)
tree25779bc18366a22cabccd56a89e0af11025d7c8a /src/http/modules
parentb29779caaf628afc28baffb71763f0725da2e0e4 (diff)
nginx-0.3.1-RELEASE importrelease-0.3.1
*) Bugfix: the segmentation fault occurred when the signal queue overflowed if the "rtsig" method was used; the bug had appeared in 0.2.0. *) Change: correct handling of the "\\", "\"", "\'", and "\$" pairs in SSI.
Diffstat (limited to 'src/http/modules')
-rw-r--r--src/http/modules/ngx_http_charset_filter_module.c8
-rw-r--r--src/http/modules/ngx_http_ssi_filter_module.c53
2 files changed, 44 insertions, 17 deletions
diff --git a/src/http/modules/ngx_http_charset_filter_module.c b/src/http/modules/ngx_http_charset_filter_module.c
index 51f115b63..8eee358be 100644
--- a/src/http/modules/ngx_http_charset_filter_module.c
+++ b/src/http/modules/ngx_http_charset_filter_module.c
@@ -75,16 +75,16 @@ static ngx_int_t ngx_http_charset_postconfiguration(ngx_conf_t *cf);
static ngx_command_t ngx_http_charset_filter_commands[] = {
{ ngx_string("charset"),
- NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF
- |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF
+ |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,
ngx_http_set_charset_slot,
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_http_charset_loc_conf_t, charset),
NULL },
{ ngx_string("source_charset"),
- NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF
- |NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF
+ |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,
ngx_http_set_charset_slot,
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_http_charset_loc_conf_t, source_charset),
diff --git a/src/http/modules/ngx_http_ssi_filter_module.c b/src/http/modules/ngx_http_ssi_filter_module.c
index acbae29eb..5f9ee3a42 100644
--- a/src/http/modules/ngx_http_ssi_filter_module.c
+++ b/src/http/modules/ngx_http_ssi_filter_module.c
@@ -1130,14 +1130,15 @@ ngx_http_ssi_parse(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx)
case ssi_double_quoted_value_state:
switch (ch) {
+ case '"':
+ state = ssi_postparam_state;
+ break;
+
case '\\':
ctx->saved_state = ssi_double_quoted_value_state;
state = ssi_quoted_symbol_state;
- break;
- case '"':
- state = ssi_postparam_state;
- break;
+ /* fall through */
default:
ctx->param->value.data[ctx->param->value.len++] = ch;
@@ -1157,14 +1158,15 @@ ngx_http_ssi_parse(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx)
case ssi_quoted_value_state:
switch (ch) {
+ case '\'':
+ state = ssi_postparam_state;
+ break;
+
case '\\':
ctx->saved_state = ssi_quoted_value_state;
state = ssi_quoted_symbol_state;
- break;
- case '\'':
- state = ssi_postparam_state;
- break;
+ /* fall through */
default:
ctx->param->value.data[ctx->param->value.len++] = ch;
@@ -1183,6 +1185,20 @@ ngx_http_ssi_parse(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx)
break;
case ssi_quoted_symbol_state:
+ state = ctx->saved_state;
+
+ if (ch == '\\') {
+ break;
+ }
+
+ if (ch == '"' && state == ssi_double_quoted_value_state) {
+ break;
+ }
+
+ if (ch == '\'' && state == ssi_quoted_value_state) {
+ break;
+ }
+
ctx->param->value.data[ctx->param->value.len++] = ch;
if (ctx->param->value.len == ctx->value_len) {
@@ -1197,7 +1213,6 @@ ngx_http_ssi_parse(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx)
}
}
- state = ctx->saved_state;
break;
case ssi_postparam_state:
@@ -1486,13 +1501,25 @@ ngx_http_ssi_evaluate_string(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx,
}
} else {
- part.len = 0;
part.data = &text->data[i];
- while (i < text->len && text->data[i] != '$') {
- i++;
- part.len++;
+ for (p = part.data; i < text->len; i++) {
+ ch = text->data[i];
+
+ if (ch == '$') {
+ if (text->data[i - 1] != '\\') {
+ break;
+ }
+
+ *(p - 1) = ch;
+
+ continue;
+ }
+
+ *p++ = ch;
}
+
+ part.len = p - part.data;
}
len += part.len;