mirror of
https://github.com/nginx/nginx.git
synced 2025-06-07 17:52:38 +08:00
*) 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
This commit is contained in:
parent
e7138540d6
commit
e58700d3b0
@ -175,7 +175,7 @@ ngx_http_random_index_handler(ngx_http_request_t *r)
|
|||||||
|
|
||||||
len = ngx_de_namelen(&dir);
|
len = ngx_de_namelen(&dir);
|
||||||
|
|
||||||
if (!dir.valid_type) {
|
if (dir.type == 0) {
|
||||||
|
|
||||||
/* 1 byte for '/' and 1 byte for terminating '\0' */
|
/* 1 byte for '/' and 1 byte for terminating '\0' */
|
||||||
|
|
||||||
|
@ -274,9 +274,8 @@ ngx_read_dir(ngx_dir_t *dir)
|
|||||||
if (dir->de) {
|
if (dir->de) {
|
||||||
#if (NGX_HAVE_D_TYPE)
|
#if (NGX_HAVE_D_TYPE)
|
||||||
dir->type = dir->de->d_type;
|
dir->type = dir->de->d_type;
|
||||||
dir->valid_type = dir->type ? 1 : 0;
|
|
||||||
#else
|
#else
|
||||||
dir->valid_type = 0;
|
dir->type = 0;
|
||||||
#endif
|
#endif
|
||||||
return NGX_OK;
|
return NGX_OK;
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,6 @@ typedef struct {
|
|||||||
|
|
||||||
unsigned type:8;
|
unsigned type:8;
|
||||||
unsigned valid_info:1;
|
unsigned valid_info:1;
|
||||||
unsigned valid_type:1;
|
|
||||||
} ngx_dir_t;
|
} ngx_dir_t;
|
||||||
|
|
||||||
|
|
||||||
@ -200,31 +199,31 @@ ngx_int_t ngx_read_dir(ngx_dir_t *dir);
|
|||||||
#else
|
#else
|
||||||
#define ngx_de_namelen(dir) ngx_strlen((dir)->de->d_name)
|
#define ngx_de_namelen(dir) ngx_strlen((dir)->de->d_name)
|
||||||
#endif
|
#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_info_n "stat()"
|
||||||
#define ngx_de_link_info(name, dir) lstat((const char *) name, &(dir)->info)
|
#define ngx_de_link_info(name, dir) lstat((const char *) name, &(dir)->info)
|
||||||
#define ngx_de_link_info_n "lstat()"
|
#define ngx_de_link_info_n "lstat()"
|
||||||
|
|
||||||
#if (NGX_HAVE_D_TYPE)
|
#if (NGX_HAVE_D_TYPE)
|
||||||
|
|
||||||
#if (NGX_LINUX)
|
/*
|
||||||
|
* some file systems (e.g. XFS on Linux and CD9660 on FreeBSD)
|
||||||
/* XFS on Linux does not set dirent.d_type */
|
* do not set dirent.d_type
|
||||||
|
*/
|
||||||
|
|
||||||
#define ngx_de_is_dir(dir) \
|
#define ngx_de_is_dir(dir) \
|
||||||
(((dir)->type) ? ((dir)->type == DT_DIR) : (S_ISDIR((dir)->info.st_mode)))
|
(((dir)->type) ? ((dir)->type == DT_DIR) : (S_ISDIR((dir)->info.st_mode)))
|
||||||
#define ngx_de_is_file(dir) \
|
#define ngx_de_is_file(dir) \
|
||||||
(((dir)->type) ? ((dir)->type == DT_REG) : (S_ISREG((dir)->info.st_mode)))
|
(((dir)->type) ? ((dir)->type == DT_REG) : (S_ISREG((dir)->info.st_mode)))
|
||||||
#define ngx_de_is_link(dir) \
|
#define ngx_de_is_link(dir) \
|
||||||
(((dir)->type) ? ((dir)->type == DT_LINK) : (S_ISLNK((dir)->info.st_mode)))
|
(((dir)->type) ? ((dir)->type == DT_LNK) : (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 */
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
@ -322,7 +322,6 @@ ngx_open_dir(ngx_str_t *name, ngx_dir_t *dir)
|
|||||||
}
|
}
|
||||||
|
|
||||||
dir->valid_info = 1;
|
dir->valid_info = 1;
|
||||||
dir->valid_type = 1;
|
|
||||||
dir->ready = 1;
|
dir->ready = 1;
|
||||||
|
|
||||||
return NGX_OK;
|
return NGX_OK;
|
||||||
@ -338,6 +337,7 @@ ngx_read_dir(ngx_dir_t *dir)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (FindNextFile(dir->dir, &dir->finddata) != 0) {
|
if (FindNextFile(dir->dir, &dir->finddata) != 0) {
|
||||||
|
dir->type = 1;
|
||||||
return NGX_OK;
|
return NGX_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ typedef struct {
|
|||||||
WIN32_FIND_DATA finddata;
|
WIN32_FIND_DATA finddata;
|
||||||
|
|
||||||
unsigned valid_info:1;
|
unsigned valid_info:1;
|
||||||
unsigned valid_type:1;
|
unsigned type:1;
|
||||||
unsigned ready:1;
|
unsigned ready:1;
|
||||||
} ngx_dir_t;
|
} ngx_dir_t;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user