* FAT's fs_read_dir() function filled the dirent::d_reclen member incorrectly,

causing a partial copy of the entry in vfs.cpp fix_dirent(), which then
  returned an error, making FAT directories unreadable.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27130 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2008-08-22 08:07:04 +00:00
parent 6a8cce077f
commit c3eeae18ec
1 changed files with 9 additions and 7 deletions

View File

@ -1215,9 +1215,9 @@ dosfs_readdir(fs_volume *_vol, fs_vnode *_dir, void *_cookie,
LOCK_VOL(vol);
if (check_nspace_magic(vol, "dosfs_readdir") ||
check_vnode_magic(dir, "dosfs_readdir") ||
check_dircookie_magic(cookie, "dosfs_readdir")) {
if (check_nspace_magic(vol, "dosfs_readdir")
|| check_vnode_magic(dir, "dosfs_readdir")
|| check_dircookie_magic(cookie, "dosfs_readdir")) {
UNLOCK_VOL(vol);
return EINVAL;
}
@ -1232,10 +1232,10 @@ dosfs_readdir(fs_volume *_vol, fs_vnode *_dir, void *_cookie,
} else {
if (cookie->current_index++ == 0) {
strcpy(entry->d_name, ".");
entry->d_reclen = 2;
entry->d_reclen = sizeof(struct dirent) + 1;
} else {
strcpy(entry->d_name, "..");
entry->d_reclen = 3;
entry->d_reclen = sizeof(struct dirent) + 2;
}
*num = 1;
entry->d_ino = vol->root_vnode.vnid;
@ -1253,8 +1253,10 @@ dosfs_readdir(fs_volume *_vol, fs_vnode *_dir, void *_cookie,
result = B_NO_ERROR;
goto bi;
}
result = get_next_dirent(vol, dir, &diri, &(entry->d_ino), entry->d_name,
result = get_next_dirent(vol, dir, &diri, &entry->d_ino, entry->d_name,
bufsize - sizeof(struct dirent) - 1);
cookie->current_index = diri.current_index;
diri_free(&diri);
@ -1264,7 +1266,7 @@ dosfs_readdir(fs_volume *_vol, fs_vnode *_dir, void *_cookie,
if (result == B_NO_ERROR) {
*num = 1;
entry->d_dev = vol->id;
entry->d_reclen = strlen(entry->d_name) + 1;
entry->d_reclen = sizeof(struct dirent) + strlen(entry->d_name);
DPRINTF(0, ("dosfs_readdir: found file %s\n", entry->d_name));
} else if (result == ENOENT) {
// When you get to the end, don't return an error, just return 0