fix utf-8 names in autoindex

This commit is contained in:
Igor Sysoev 2008-07-25 14:29:05 +00:00
parent 6df67879a0
commit 96eaa05fd2
3 changed files with 37 additions and 32 deletions

View File

@ -955,7 +955,7 @@ ngx_decode_base64(ngx_str_t *dst, ngx_str_t *src)
* ngx_utf_decode() decodes two and more bytes UTF sequences only * ngx_utf_decode() decodes two and more bytes UTF sequences only
* the return values: * the return values:
* 0x80 - 0x10ffff valid character * 0x80 - 0x10ffff valid character
* 0x10ffff - 0xfffffffd invalid sequence * 0x110000 - 0xfffffffd invalid sequence
* 0xfffffffe incomplete sequence * 0xfffffffe incomplete sequence
* 0xffffffff error * 0xffffffff error
*/ */
@ -1020,29 +1020,24 @@ ngx_utf_decode(u_char **p, size_t n)
size_t size_t
ngx_utf_length(u_char *p, size_t n) ngx_utf_length(u_char *p, size_t n)
{ {
u_char c; u_char c, *last;
size_t len; size_t len;
ngx_uint_t i;
for (len = 0, i = 0; i < n; len++, i++) { last = p + n;
c = p[i]; for (len = 0; p < last; len++) {
c = *p;
if (c < 0x80) { if (c < 0x80) {
p++;
continue; continue;
} }
if (c >= 0xc0) { if (ngx_utf_decode(&p, n) > 0x10ffff) {
for (c <<= 1; c & 0x80; c <<= 1) { /* invalid utf */
i++; return n;
}
continue;
} }
/* invalid utf */
return n;
} }
return len; return len;
@ -1050,36 +1045,45 @@ ngx_utf_length(u_char *p, size_t n)
u_char * u_char *
ngx_utf_cpystrn(u_char *dst, u_char *src, size_t n) ngx_utf_cpystrn(u_char *dst, u_char *src, size_t n, size_t len)
{ {
u_char c; u_char c, *next;
if (n == 0) { if (n == 0) {
return dst; return dst;
} }
for ( /* void */ ; --n; dst++, src++) { while (--n) {
c = *src; c = *src;
*dst = c; *dst = c;
if (c < 0x80) { if (c < 0x80) {
if (*dst != '\0') {
if (c != '\0') {
dst++;
src++;
len--;
continue; continue;
} }
return dst; return dst;
} }
if (c >= 0xc0) { next = src;
for (c <<= 1; c & 0x80; c <<= 1) {
*++dst = *++src;
}
continue; if (ngx_utf_decode(&next, len) > 0x10ffff) {
/* invalid utf */
break;
} }
/* invalid utf */ len--;
while (src < next) {
*++dst = *++src;
len--;
}
} }
*dst = '\0'; *dst = '\0';

View File

@ -153,7 +153,7 @@ ngx_int_t ngx_decode_base64(ngx_str_t *dst, ngx_str_t *src);
uint32_t ngx_utf_decode(u_char **p, size_t n); uint32_t ngx_utf_decode(u_char **p, size_t n);
size_t ngx_utf_length(u_char *p, size_t n); size_t ngx_utf_length(u_char *p, size_t n);
u_char *ngx_utf_cpystrn(u_char *dst, u_char *src, size_t n); u_char *ngx_utf_cpystrn(u_char *dst, u_char *src, size_t n, size_t len);
#define NGX_ESCAPE_URI 0 #define NGX_ESCAPE_URI 0

View File

@ -135,7 +135,7 @@ ngx_http_autoindex_handler(ngx_http_request_t *r)
{ {
u_char *last, *filename, scale; u_char *last, *filename, scale;
off_t length; off_t length;
size_t len, copy, allocated, root; size_t len, utf_len, allocated, root;
ngx_tm_t tm; ngx_tm_t tm;
ngx_err_t err; ngx_err_t err;
ngx_buf_t *b; ngx_buf_t *b;
@ -412,15 +412,16 @@ ngx_http_autoindex_handler(ngx_http_request_t *r)
len = entry[i].utf_len; len = entry[i].utf_len;
if (entry[i].name.len - len) { if (entry[i].name.len != len) {
if (len > NGX_HTTP_AUTOINDEX_NAME_LEN) { if (len > NGX_HTTP_AUTOINDEX_NAME_LEN) {
copy = NGX_HTTP_AUTOINDEX_NAME_LEN - 3 + 1; utf_len = NGX_HTTP_AUTOINDEX_NAME_LEN - 3 + 1;
} else { } else {
copy = NGX_HTTP_AUTOINDEX_NAME_LEN + 1; utf_len = NGX_HTTP_AUTOINDEX_NAME_LEN + 1;
} }
b->last = ngx_utf_cpystrn(b->last, entry[i].name.data, copy); b->last = ngx_utf_cpystrn(b->last, entry[i].name.data,
utf_len, entry[i].name.len + 1);
last = b->last; last = b->last;
} else { } else {