From 5a1ca77b478ac208f15b6656f23f294f42311138 Mon Sep 17 00:00:00 2001 From: Jeremy Sowden Date: Wed, 1 May 2024 20:36:28 +0100 Subject: [PATCH] scanner: don't skip directory entries with type `DT_UNKNOWN` According to the readdir(2) man-page, not all file-systems support returning the entry's file-type in `d_type`. For example, the reprotest reproducibility tool, uses the disorderfs FUSE file-system to shuffle the order in which directory entries are returned, and this does not set `d_type`. Therefore, in addition to entries with type `DT_DIR` and `DT_LNK`, also process entries with type `DT_UNKNOWN`. Signed-off-by: Jeremy Sowden --- lib/mu-scanner.cc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/mu-scanner.cc b/lib/mu-scanner.cc index ddda1598..bbc8d7e6 100644 --- a/lib/mu-scanner.cc +++ b/lib/mu-scanner.cc @@ -215,9 +215,13 @@ Scanner::Private::process_dir(const std::string& path, bool is_maildir) while (running_) { errno = 0; if (const auto& dentry{::readdir(dir)}; dentry) { -#if HAVE_DIRENT_D_TYPE /* opttimization: filter out non-dirs early */ +#if HAVE_DIRENT_D_TYPE /* optimization: filter out non-dirs early. NB not all file-systems support + * returning the file-type in `d_type`, so don't skip `DT_UNKNOWN`. + */ if (maildirs_only_mode() && - dentry->d_type != DT_DIR && dentry->d_type != DT_LNK) + dentry->d_type != DT_DIR && + dentry->d_type != DT_LNK && + dentry->d_type != DT_UNKNOWN) continue; #endif /*HAVE_DIRENT_D_TYPE*/ dir_entries.emplace_back(dentry);