From faebc42f0d123b1c9946e73101cd490f2d138c37 Mon Sep 17 00:00:00 2001 From: ITotalJustice <47043333+ITotalJustice@users.noreply.github.com> Date: Sat, 27 Sep 2025 03:37:29 +0100 Subject: [PATCH] fs: fix stdio dir count not filtering types. game/bfsar: fix dir listing loop exiting early due to post increment in the loop. --- sphaira/source/fs.cpp | 14 ++++++++++++++ sphaira/source/utils/devoptab_bfsar.cpp | 2 +- sphaira/source/utils/devoptab_game.cpp | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/sphaira/source/fs.cpp b/sphaira/source/fs.cpp index 41ef168..774b5c2 100644 --- a/sphaira/source/fs.cpp +++ b/sphaira/source/fs.cpp @@ -688,6 +688,20 @@ Result Dir::GetEntryCount(s64* out) { if (!std::strcmp(d->d_name, ".") || !std::strcmp(d->d_name, "..")) { continue; } + + if (d->d_type == DT_DIR) { + if (!(m_mode & FsDirOpenMode_ReadDirs)) { + continue; + } + } else if (d->d_type == DT_REG) { + if (!(m_mode & FsDirOpenMode_ReadFiles)) { + continue; + } + } else { + log_write("[FS] WARNING: unknown type when counting dir: %u\n", d->d_type); + continue; + } + (*out)++; } diff --git a/sphaira/source/utils/devoptab_bfsar.cpp b/sphaira/source/utils/devoptab_bfsar.cpp index b2b191d..4d379fe 100644 --- a/sphaira/source/utils/devoptab_bfsar.cpp +++ b/sphaira/source/utils/devoptab_bfsar.cpp @@ -215,7 +215,7 @@ int Device::devoptab_dirnext(void* fd, char *filename, struct stat *filestat) { filestat->st_mode = S_IFREG | S_IRUSR | S_IRGRP | S_IROTH; dir->index++; break; - } while (dir->index++); + } while (++dir->index); return 0; } diff --git a/sphaira/source/utils/devoptab_game.cpp b/sphaira/source/utils/devoptab_game.cpp index f1bfdd3..16322a0 100644 --- a/sphaira/source/utils/devoptab_game.cpp +++ b/sphaira/source/utils/devoptab_game.cpp @@ -425,7 +425,7 @@ int Device::devoptab_dirnext(void* fd, char *filename, struct stat *filestat) { std::snprintf(filename, NAME_MAX, "%s", content.nsp->path.s); dir->index++; break; - } while (dir->index++); + } while (++dir->index); } return 0;