]> git.kaiwu.me - nginx.git/commitdiff
merge r3201, r3204, r3411:
authorIgor Sysoev <igor@sysoev.ru>
Mon, 1 Feb 2010 14:52:25 +0000 (14:52 +0000)
committerIgor Sysoev <igor@sysoev.ru>
Mon, 1 Feb 2010 14:52:25 +0000 (14:52 +0000)
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

src/core/ngx_string.c
src/http/modules/ngx_http_random_index_module.c
src/os/unix/ngx_files.c
src/os/unix/ngx_files.h
src/os/win32/ngx_files.c
src/os/win32/ngx_files.h

index 3456baa5c5415550143ef7f8ca7751d5a98ad086..f8b1657310ea5fcfe2f64f19fb557bfe972cc8df 100644 (file)
@@ -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--;
         }
     }
index bb5544ae6d9ec27bca96b424c24ce8a772eacf57..7b0ec503ce45804244b296e071dc539d69c22d49 100644 (file)
@@ -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' */
 
index 98ed0822966316806748148711870ace9edae86d..10436a91802214d0abd7e5f8d29baf2613776247 100644 (file)
@@ -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;
     }
index 5395acd03c32843b08d04abd6f78a4ac01c33e63..2d90bc8b6ceca453b4ce07ec79947a204b676e2e 100644 (file)
@@ -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
 
index c74ec5886f20b087529264405f50d1d4b380f09c..94bdc8840cfa1bf9e59243b33751935e12db64c8 100644 (file)
@@ -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;
     }
 
index 950bd98a2017e84be7e235469c2bfb062dda8b1a..757c44a6fc51f76ba7d0aa444ae643919585faba 100644 (file)
@@ -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;