From 3255108dde2c50590d5077cd33510935fb6ee5ac Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Mon, 7 Sep 2020 21:06:32 +0200 Subject: [PATCH] ufs2: fix reading directories. Main problem was the use of sizeof(dirent) instead of sizeof(struct dirent) so it used the size of the pointer. Change-Id: I7d9388235d583d942ada5e3650cf8320ff2be6cb Reviewed-on: https://review.haiku-os.org/c/haiku/+/3197 Reviewed-by: waddlesplash --- .../kernel/file_systems/ufs2/kernel_interface.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/add-ons/kernel/file_systems/ufs2/kernel_interface.cpp b/src/add-ons/kernel/file_systems/ufs2/kernel_interface.cpp index 9607d29140..0234ee88ad 100644 --- a/src/add-ons/kernel/file_systems/ufs2/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/ufs2/kernel_interface.cpp @@ -265,7 +265,6 @@ ufs2_open(fs_volume * _volume, fs_vnode *_node, int openMode, { //Volume* volume = (Volume*)_volume->private_volume; Inode* inode = (Inode*)_node->private_node; - TRACE("in open %d \n", openMode); if (inode->IsDirectory()) return B_IS_A_DIRECTORY; @@ -315,7 +314,6 @@ ufs2_free_cookie(fs_volume *_volume, fs_vnode *_node, void *_cookie) static status_t ufs2_access(fs_volume *_volume, fs_vnode *_node, int accessMode) { - TRACE("In access\n"); return B_OK; } @@ -381,8 +379,9 @@ ufs2_read_dir(fs_volume *_volume, fs_vnode *_node, void *_cookie, uint32 maxCount = *_num; uint32 count = 0; - while (count < maxCount && (bufferSize > sizeof(struct dirent))) { - size_t length = bufferSize - sizeof(struct dirent) + 1; + while (count < maxCount + && (bufferSize >= sizeof(struct dirent) + B_FILE_NAME_LENGTH)) { + size_t length = bufferSize; ino_t iNodeNo; status_t status = iterator->GetNext(dirent->d_name, &length, &iNodeNo); @@ -398,7 +397,7 @@ ufs2_read_dir(fs_volume *_volume, fs_vnode *_node, void *_cookie, dirent->d_dev = volume->ID(); dirent->d_ino = iNodeNo; - dirent->d_reclen = sizeof(dirent) + length; + dirent->d_reclen = sizeof(struct dirent) + length; bufferSize -= dirent->d_reclen; dirent = (struct dirent*)((uint8*)dirent + dirent->d_reclen); count++;