diff --git a/kernel/kernel/OpenFileDescriptorSet.cpp b/kernel/kernel/OpenFileDescriptorSet.cpp index 81486da0..d246148a 100644 --- a/kernel/kernel/OpenFileDescriptorSet.cpp +++ b/kernel/kernel/OpenFileDescriptorSet.cpp @@ -330,8 +330,11 @@ namespace Kernel return BAN::Error::from_errno(EACCES); for (;;) { - auto ret = open_file.inode()->list_next_inodes(open_file.offset()++, list, list_len); - if (ret.is_error() && ret.error().get_error_code() == ENODATA) + auto ret = open_file.inode()->list_next_inodes(open_file.offset(), list, list_len); + if (ret.is_error() && ret.error().get_error_code() != ENODATA) + return ret; + open_file.offset()++; + if (ret.is_error()) continue; return ret; } diff --git a/userspace/libraries/LibC/dirent.cpp b/userspace/libraries/LibC/dirent.cpp index d3c43299..339a6157 100644 --- a/userspace/libraries/LibC/dirent.cpp +++ b/userspace/libraries/LibC/dirent.cpp @@ -10,9 +10,10 @@ struct __DIR int fd { -1 }; size_t entry_count { 0 }; size_t entry_index { 0 }; - // FIXME: we should probably allocate entries dynamically - // based if syscall returns ENOBUFS - dirent entries[128]; + size_t entries_size { 0 }; + dirent* entries { nullptr }; + + static constexpr size_t default_entries_size { 128 }; }; int closedir(DIR* dirp) @@ -42,10 +43,18 @@ int dirfd(DIR* dirp) DIR* fdopendir(int fd) { - DIR* dirp = (DIR*)malloc(sizeof(DIR)); + DIR* dirp = static_cast