summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2010-02-01 14:52:25 +0000
committerIgor Sysoev <igor@sysoev.ru>2010-02-01 14:52:25 +0000
commitaf7e5336829540d80490fc4fa7153ce2efb95954 (patch)
tree3e5e0dfc8e736f6f579ede80f284930ae681c6b1 /src
parent30ee8008be32ec1b7229eff2bd0b2462146c480c (diff)
downloadnginx-af7e5336829540d80490fc4fa7153ce2efb95954.tar.gz
nginx-af7e5336829540d80490fc4fa7153ce2efb95954.tar.bz2
merge r3201, r3204, r3411:
ngx_http_autoindex_module fixes: *) reset cached dirent.d_type after stat() this fixes slash after link to a directory in ngx_http_autoindex_module; *) use cached dirent.d_type as hint on all systems the issues has been introduced in r2235 *) fix ngx_utf8_cpystrn(): it did not fully copy utf-8 string
Diffstat (limited to 'src')
-rw-r--r--src/core/ngx_string.c4
-rw-r--r--src/http/modules/ngx_http_random_index_module.c2
-rw-r--r--src/os/unix/ngx_files.c3
-rw-r--r--src/os/unix/ngx_files.h27
-rw-r--r--src/os/win32/ngx_files.c2
-rw-r--r--src/os/win32/ngx_files.h2
6 files changed, 18 insertions, 22 deletions
diff --git a/src/core/ngx_string.c b/src/core/ngx_string.c
index 3456baa5c..f8b165731 100644
--- a/src/core/ngx_string.c
+++ b/src/core/ngx_string.c
@@ -1238,10 +1238,8 @@ ngx_utf8_cpystrn(u_char *dst, u_char *src, size_t n, size_t len)
break;
}
- len--;
-
while (src < next) {
- *++dst = *++src;
+ *dst++ = *src++;
len--;
}
}
diff --git a/src/http/modules/ngx_http_random_index_module.c b/src/http/modules/ngx_http_random_index_module.c
index bb5544ae6..7b0ec503c 100644
--- a/src/http/modules/ngx_http_random_index_module.c
+++ b/src/http/modules/ngx_http_random_index_module.c
@@ -175,7 +175,7 @@ ngx_http_random_index_handler(ngx_http_request_t *r)
len = ngx_de_namelen(&dir);
- if (!dir.valid_type) {
+ if (dir.type == 0 || ngx_de_is_link(&dir)) {
/* 1 byte for '/' and 1 byte for terminating '\0' */
diff --git a/src/os/unix/ngx_files.c b/src/os/unix/ngx_files.c
index 98ed08229..10436a918 100644
--- a/src/os/unix/ngx_files.c
+++ b/src/os/unix/ngx_files.c
@@ -262,9 +262,8 @@ ngx_read_dir(ngx_dir_t *dir)
if (dir->de) {
#if (NGX_HAVE_D_TYPE)
dir->type = dir->de->d_type;
- dir->valid_type = dir->type ? 1 : 0;
#else
- dir->valid_type = 0;
+ dir->type = 0;
#endif
return NGX_OK;
}
diff --git a/src/os/unix/ngx_files.h b/src/os/unix/ngx_files.h
index 5395acd03..2d90bc8b6 100644
--- a/src/os/unix/ngx_files.h
+++ b/src/os/unix/ngx_files.h
@@ -24,7 +24,6 @@ typedef struct {
unsigned type:8;
unsigned valid_info:1;
- unsigned valid_type:1;
} ngx_dir_t;
@@ -200,31 +199,31 @@ ngx_int_t ngx_read_dir(ngx_dir_t *dir);
#else
#define ngx_de_namelen(dir) ngx_strlen((dir)->de->d_name)
#endif
-#define ngx_de_info(name, dir) stat((const char *) name, &(dir)->info)
+
+static ngx_inline ngx_int_t
+ngx_de_info(u_char *name, ngx_dir_t *dir)
+{
+ dir->type = 0;
+ return stat((const char *) name, &dir->info);
+}
+
#define ngx_de_info_n "stat()"
#define ngx_de_link_info(name, dir) lstat((const char *) name, &(dir)->info)
#define ngx_de_link_info_n "lstat()"
#if (NGX_HAVE_D_TYPE)
-#if (NGX_LINUX)
-
-/* XFS on Linux does not set dirent.d_type */
+/*
+ * some file systems (e.g. XFS on Linux and CD9660 on FreeBSD)
+ * do not set dirent.d_type
+ */
#define ngx_de_is_dir(dir) \
(((dir)->type) ? ((dir)->type == DT_DIR) : (S_ISDIR((dir)->info.st_mode)))
#define ngx_de_is_file(dir) \
(((dir)->type) ? ((dir)->type == DT_REG) : (S_ISREG((dir)->info.st_mode)))
#define ngx_de_is_link(dir) \
- (((dir)->type) ? ((dir)->type == DT_LINK) : (S_ISLNK((dir)->info.st_mode)))
-
-#else
-
-#define ngx_de_is_dir(dir) ((dir)->type == DT_DIR)
-#define ngx_de_is_file(dir) ((dir)->type == DT_REG)
-#define ngx_de_is_link(dir) ((dir)->type == DT_LINK)
-
-#endif /* NGX_LINUX */
+ (((dir)->type) ? ((dir)->type == DT_LNK) : (S_ISLNK((dir)->info.st_mode)))
#else
diff --git a/src/os/win32/ngx_files.c b/src/os/win32/ngx_files.c
index c74ec5886..94bdc8840 100644
--- a/src/os/win32/ngx_files.c
+++ b/src/os/win32/ngx_files.c
@@ -376,7 +376,6 @@ ngx_open_dir(ngx_str_t *name, ngx_dir_t *dir)
}
dir->valid_info = 1;
- dir->valid_type = 1;
dir->ready = 1;
return NGX_OK;
@@ -392,6 +391,7 @@ ngx_read_dir(ngx_dir_t *dir)
}
if (FindNextFile(dir->dir, &dir->finddata) != 0) {
+ dir->type = 1;
return NGX_OK;
}
diff --git a/src/os/win32/ngx_files.h b/src/os/win32/ngx_files.h
index 950bd98a2..757c44a6f 100644
--- a/src/os/win32/ngx_files.h
+++ b/src/os/win32/ngx_files.h
@@ -21,7 +21,7 @@ typedef struct {
WIN32_FIND_DATA finddata;
unsigned valid_info:1;
- unsigned valid_type:1;
+ unsigned type:1;
unsigned ready:1;
} ngx_dir_t;