mirror of
https://github.com/nginx/nginx.git
synced 2025-06-15 15:40:38 +08:00
fix utf-8 names in autoindex
This commit is contained in:
parent
6df67879a0
commit
96eaa05fd2
@ -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';
|
||||||
|
@ -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
|
||||||
|
@ -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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user