From c3eeae18ec9ed63d3afa7bfd62171d9ffd948403 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Fri, 22 Aug 2008 08:07:04 +0000 Subject: [PATCH] * 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 --- src/add-ons/kernel/file_systems/fat/dir.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/add-ons/kernel/file_systems/fat/dir.c b/src/add-ons/kernel/file_systems/fat/dir.c index d89c416bfc..e0ce4d2c40 100644 --- a/src/add-ons/kernel/file_systems/fat/dir.c +++ b/src/add-ons/kernel/file_systems/fat/dir.c @@ -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