win,fs: fix bug in fs__readdir
This commit is contained in:
parent
670e75ee7e
commit
1cbffcbd5d
@ -1651,12 +1651,12 @@ void fs__readdir(uv_fs_t* req) {
|
|||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
/* Copy file type. */
|
/* Copy file type. */
|
||||||
if ((find_data->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0)
|
if ((find_data->dwFileAttributes & FILE_ATTRIBUTE_DEVICE) != 0)
|
||||||
dent.d_type = UV__DT_DIR;
|
dent.d_type = UV__DT_CHAR;
|
||||||
else if ((find_data->dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0)
|
else if ((find_data->dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0)
|
||||||
dent.d_type = UV__DT_LINK;
|
dent.d_type = UV__DT_LINK;
|
||||||
else if ((find_data->dwFileAttributes & FILE_ATTRIBUTE_DEVICE) != 0)
|
else if ((find_data->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0)
|
||||||
dent.d_type = UV__DT_CHAR;
|
dent.d_type = UV__DT_DIR;
|
||||||
else
|
else
|
||||||
dent.d_type = UV__DT_FILE;
|
dent.d_type = UV__DT_FILE;
|
||||||
|
|
||||||
|
|||||||
@ -29,6 +29,7 @@ static uv_fs_t readdir_req;
|
|||||||
static uv_fs_t closedir_req;
|
static uv_fs_t closedir_req;
|
||||||
|
|
||||||
static uv_dirent_t dirents[1];
|
static uv_dirent_t dirents[1];
|
||||||
|
static uv_dirent_t symlink_dirents[2];
|
||||||
|
|
||||||
static int empty_opendir_cb_count;
|
static int empty_opendir_cb_count;
|
||||||
static int empty_closedir_cb_count;
|
static int empty_closedir_cb_count;
|
||||||
@ -460,3 +461,88 @@ TEST_IMPL(fs_readdir_non_empty_dir) {
|
|||||||
MAKE_VALGRIND_HAPPY(uv_default_loop());
|
MAKE_VALGRIND_HAPPY(uv_default_loop());
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void readdir_symlink_readdir_cb(uv_fs_t* req) {
|
||||||
|
uv_dir_t* dir;
|
||||||
|
|
||||||
|
ASSERT_PTR_EQ(req, &readdir_req);
|
||||||
|
ASSERT_EQ(req->fs_type, UV_FS_READDIR);
|
||||||
|
dir = req->ptr;
|
||||||
|
|
||||||
|
if (req->result == 0) {
|
||||||
|
uv_fs_req_cleanup(req);
|
||||||
|
ASSERT_EQ(3, non_empty_readdir_cb_count);
|
||||||
|
uv_fs_closedir(uv_default_loop(),
|
||||||
|
&closedir_req,
|
||||||
|
dir,
|
||||||
|
non_empty_closedir_cb);
|
||||||
|
} else {
|
||||||
|
if (strcmp(symlink_dirents[0].name, "test_symlink") == 0) {
|
||||||
|
ASSERT_EQ(symlink_dirents[0].type, UV_DIRENT_LINK);
|
||||||
|
} else {
|
||||||
|
ASSERT_EQ(symlink_dirents[1].type, UV_DIRENT_LINK);
|
||||||
|
}
|
||||||
|
uv_fs_req_cleanup(req);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void readdir_symlink_opendir_cb(uv_fs_t* req) {
|
||||||
|
uv_dir_t* dir;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
ASSERT_PTR_EQ(req, &opendir_req);
|
||||||
|
ASSERT_EQ(req->fs_type, UV_FS_OPENDIR);
|
||||||
|
ASSERT_OK(req->result);
|
||||||
|
ASSERT_NOT_NULL(req->ptr);
|
||||||
|
|
||||||
|
dir = req->ptr;
|
||||||
|
dir->dirents = symlink_dirents;
|
||||||
|
dir->nentries = ARRAY_SIZE(symlink_dirents);
|
||||||
|
|
||||||
|
r = uv_fs_readdir(uv_default_loop(),
|
||||||
|
&readdir_req,
|
||||||
|
dir,
|
||||||
|
readdir_symlink_readdir_cb);
|
||||||
|
ASSERT_OK(r);
|
||||||
|
uv_fs_req_cleanup(req);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cleanup_symlink_test_files(void) {
|
||||||
|
uv_fs_t req;
|
||||||
|
|
||||||
|
uv_fs_rmdir(NULL, &req, "test_symlink_dir/test_subdir", NULL);
|
||||||
|
uv_fs_req_cleanup(&req);
|
||||||
|
uv_fs_unlink(NULL, &req, "test_symlink_dir/test_symlink", NULL);
|
||||||
|
uv_fs_req_cleanup(&req);
|
||||||
|
uv_fs_rmdir(NULL, &req, "test_symlink_dir", NULL);
|
||||||
|
uv_fs_req_cleanup(&req);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(fs_readdir_symlink) {
|
||||||
|
|
||||||
|
uv_fs_t mkdir_req;
|
||||||
|
uv_fs_t symlink_req;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
cleanup_symlink_test_files();
|
||||||
|
|
||||||
|
r = uv_fs_mkdir(uv_default_loop(), &mkdir_req, "test_symlink_dir", 0755, NULL);
|
||||||
|
ASSERT_OK(r);
|
||||||
|
|
||||||
|
r = uv_fs_mkdir(uv_default_loop(), &mkdir_req, "test_symlink_dir/test_subdir", 0755, NULL);
|
||||||
|
ASSERT_OK(r);
|
||||||
|
|
||||||
|
r = uv_fs_symlink(uv_default_loop(), &symlink_req, "test_symlink_dir/test_subdir", "test_symlink_dir/test_symlink", UV_FS_SYMLINK_DIR, NULL);
|
||||||
|
ASSERT_OK(r);
|
||||||
|
|
||||||
|
r = uv_fs_opendir(uv_default_loop(), &opendir_req, "test_symlink_dir", readdir_symlink_opendir_cb);
|
||||||
|
ASSERT_OK(r);
|
||||||
|
|
||||||
|
r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
|
||||||
|
ASSERT_OK(r);
|
||||||
|
|
||||||
|
cleanup_symlink_test_files();
|
||||||
|
|
||||||
|
MAKE_VALGRIND_HAPPY(uv_default_loop());
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|||||||
@ -428,6 +428,9 @@ TEST_DECLARE (fs_readdir_empty_dir)
|
|||||||
TEST_DECLARE (fs_readdir_file)
|
TEST_DECLARE (fs_readdir_file)
|
||||||
TEST_DECLARE (fs_readdir_non_empty_dir)
|
TEST_DECLARE (fs_readdir_non_empty_dir)
|
||||||
TEST_DECLARE (fs_readdir_non_existing_dir)
|
TEST_DECLARE (fs_readdir_non_existing_dir)
|
||||||
|
#ifdef _WIN32
|
||||||
|
TEST_DECLARE (fs_readdir_symlink)
|
||||||
|
#endif
|
||||||
TEST_DECLARE (fs_rename_to_existing_file)
|
TEST_DECLARE (fs_rename_to_existing_file)
|
||||||
TEST_DECLARE (fs_write_multiple_bufs)
|
TEST_DECLARE (fs_write_multiple_bufs)
|
||||||
TEST_DECLARE (fs_read_write_null_arguments)
|
TEST_DECLARE (fs_read_write_null_arguments)
|
||||||
@ -1138,6 +1141,9 @@ TASK_LIST_START
|
|||||||
TEST_ENTRY (fs_readdir_file)
|
TEST_ENTRY (fs_readdir_file)
|
||||||
TEST_ENTRY (fs_readdir_non_empty_dir)
|
TEST_ENTRY (fs_readdir_non_empty_dir)
|
||||||
TEST_ENTRY (fs_readdir_non_existing_dir)
|
TEST_ENTRY (fs_readdir_non_existing_dir)
|
||||||
|
#ifdef _WIN32
|
||||||
|
TEST_ENTRY (fs_readdir_symlink)
|
||||||
|
#endif
|
||||||
TEST_ENTRY (fs_rename_to_existing_file)
|
TEST_ENTRY (fs_rename_to_existing_file)
|
||||||
TEST_ENTRY (fs_write_multiple_bufs)
|
TEST_ENTRY (fs_write_multiple_bufs)
|
||||||
TEST_ENTRY (fs_write_alotof_bufs)
|
TEST_ENTRY (fs_write_alotof_bufs)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user