Mercurial > hg > nginx-ranges
diff src/core/ngx_string.c @ 150:50bd986c5d63 NGINX_0_3_22
nginx 0.3.22
*) Feature: the ngx_http_perl_module supports the $r->args and
$r->unescape methods.
*) Feature: the method $r->query_string of ngx_http_perl_module was
canceled.
*) Bugfix: segmentation fault was occurred if the "none" or "blocked"
values was specified in the "valid_referers" directive; bug appeared
in 0.3.18.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Tue, 17 Jan 2006 00:00:00 +0300 |
parents | 8e6d4d96ec4c |
children | 6be073125f2e |
line wrap: on
line diff
--- a/src/core/ngx_string.c +++ b/src/core/ngx_string.c @@ -931,7 +931,7 @@ ngx_escape_uri(u_char *dst, u_char *src, void -ngx_unescape_uri(u_char **dst, u_char **src, size_t size) +ngx_unescape_uri(u_char **dst, u_char **src, size_t size, ngx_uint_t type) { u_char *d, *s, ch, c, decoded; enum { @@ -952,7 +952,7 @@ ngx_unescape_uri(u_char **dst, u_char ** switch (state) { case sw_usual: - if (ch == '?') { + if (ch == '?' && type == NGX_UNESCAPE_URI) { *d++ = ch; goto done; } @@ -995,12 +995,18 @@ ngx_unescape_uri(u_char **dst, u_char ** if (ch >= '0' && ch <= '9') { ch = (u_char) ((decoded << 4) + ch - '0'); - if (ch > '%' && ch < 0x7f) { - *d++ = ch; + if (type == NGX_UNESCAPE_URI) { + if (ch > '%' && ch < 0x7f) { + *d++ = ch; + break; + } + + *d++ = '%'; *d++ = *(s - 2); *d++ = *(s - 1); + break; } - *d++ = '%'; *d++ = *(s - 2); *d++ = *(s - 1); + *d++ = ch; break; } @@ -1009,17 +1015,22 @@ ngx_unescape_uri(u_char **dst, u_char ** if (c >= 'a' && c <= 'f') { ch = (u_char) ((decoded << 4) + c - 'a' + 10); - if (ch == '?') { - *d++ = ch; - goto done; - } + if (type == NGX_UNESCAPE_URI) { + if (ch == '?') { + *d++ = ch; + goto done; + } - if (ch > '%' && ch < 0x7f) { - *d++ = ch; + if (ch > '%' && ch < 0x7f) { + *d++ = ch; + break; + } + + *d++ = '%'; *d++ = *(s - 2); *d++ = *(s - 1); break; } - *d++ = '%'; *d++ = *(s - 2); *d++ = *(s - 1); + *d++ = ch; break; }