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++; }