From e285b3071d39610aaf51fb893d16a83a0f5cd0e0 Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Tue, 27 Sep 2022 17:10:50 -0400 Subject: [PATCH] Introduce a utility function for moving to the next dirent in read_dir. This takes care of making sure the dirent buffer is properly aligned, which it needs to be on some platforms (SPARC, ARM, etc.) Change-Id: I9a6352b1e654c090a200770d51f96511ee024a99 --- headers/private/file_systems/fs_ops_support.h | 36 +++++++++++++++++++ .../file_systems/bfs/kernel_interface.cpp | 8 ++--- 2 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 headers/private/file_systems/fs_ops_support.h diff --git a/headers/private/file_systems/fs_ops_support.h b/headers/private/file_systems/fs_ops_support.h new file mode 100644 index 0000000000..a2b2f3875f --- /dev/null +++ b/headers/private/file_systems/fs_ops_support.h @@ -0,0 +1,36 @@ +/* + * Copyright 2022, Haiku, Inc. All rights reserved. + * Distributed under the terms of the MIT License. + */ +#ifndef FS_OPS_SUPPORT_H +#define FS_OPS_SUPPORT_H + +#ifndef FS_SHELL +# include +# include +# include +#else +# include "fssh_kernel_priv.h" +#endif + + +static struct dirent* +next_dirent(struct dirent* dirent, size_t nameLength, size_t& bufferRemaining) +{ + const size_t reclen = offsetof(struct dirent, d_name) + nameLength + 1; + ASSERT(reclen <= bufferRemaining); + dirent->d_reclen = reclen; + + const size_t roundedReclen = ROUNDUP(reclen, alignof(struct dirent)); + if (roundedReclen >= bufferRemaining) { + bufferRemaining -= reclen; + return NULL; + } + dirent->d_reclen = roundedReclen; + bufferRemaining -= roundedReclen; + + return (struct dirent*)((uint8*)dirent + roundedReclen); +} + + +#endif // FS_OPS_SUPPORT_H diff --git a/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp b/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp index 8d120de691..fa2cc8e629 100644 --- a/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp @@ -19,6 +19,8 @@ #include "bfs_control.h" #include "bfs_disk_system.h" +#include + // TODO: temporary solution as long as there is no public I/O requests API #ifndef FS_SHELL # include @@ -1755,14 +1757,10 @@ bfs_read_dir(fs_volume* _volume, fs_vnode* _node, void* _cookie, if (status != B_OK) RETURN_ERROR(status); - ASSERT(length < nameBufferSize); - dirent->d_dev = volume->ID(); dirent->d_ino = id; - dirent->d_reclen = offsetof(struct dirent, d_name) + length + 1; - bufferSize -= dirent->d_reclen; - dirent = (struct dirent*)((uint8*)dirent + dirent->d_reclen); + dirent = next_dirent(dirent, length, bufferSize); count++; }