aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbbuerge <b.buerge@pm.me>2026-10-29 15:49:35 +0000
committerbbuerge <b.buerge@pm.me>2026-10-29 15:49:35 +0000
commitc540c6f00556d45ee957e06c788da5b6d33b4cb8 (patch)
tree050632a668e7237abcac764f22630af166738937
parente85b200f4006b046d65e8b7f56e7f9ef82feee37 (diff)
downloadkernel-feature/detectFatType.tar.xz
kernel-feature/detectFatType.zip
kernel/filesystem: custom err code unsupported fs, fix validatefeature/detectFatType
-rw-r--r--kernel/kernel/filesystems/fat32/error.cpp3
-rw-r--r--kernel/kernel/filesystems/fat32/error.hpp1
-rw-r--r--kernel/kernel/filesystems/fat32/filesystem.cpp8
-rw-r--r--kernel/kernel/filesystems/fat32/filesystem.tests.cpp11
4 files changed, 11 insertions, 12 deletions
diff --git a/kernel/kernel/filesystems/fat32/error.cpp b/kernel/kernel/filesystems/fat32/error.cpp
index e8e72fb7..7ac8931e 100644
--- a/kernel/kernel/filesystems/fat32/error.cpp
+++ b/kernel/kernel/filesystems/fat32/error.cpp
@@ -26,6 +26,8 @@ namespace kernel::filesystems::fat32
return "invalid boot signature";
case errc::invalid_boot_sector:
return "invalid boot sector";
+ case errc::unsupported_fat_fs:
+ return "unsupported fat filesystem (only fat32 is supported)";
case errc::invalid_cluster:
return "invalid cluster";
case errc::corrupted_cluster_chain:
@@ -42,6 +44,7 @@ namespace kernel::filesystems::fat32
{
case errc::invalid_boot_signature:
case errc::invalid_boot_sector:
+ case errc::unsupported_fat_fs:
case errc::invalid_cluster:
case errc::corrupted_cluster_chain:
if (condition.category() == kernel::vfs::category())
diff --git a/kernel/kernel/filesystems/fat32/error.hpp b/kernel/kernel/filesystems/fat32/error.hpp
index 0b06c503..6b3164cc 100644
--- a/kernel/kernel/filesystems/fat32/error.hpp
+++ b/kernel/kernel/filesystems/fat32/error.hpp
@@ -13,6 +13,7 @@ namespace kernel::filesystems::fat32
{
invalid_boot_signature = 1,
invalid_boot_sector,
+ unsupported_fat_fs,
invalid_cluster,
corrupted_cluster_chain,
};
diff --git a/kernel/kernel/filesystems/fat32/filesystem.cpp b/kernel/kernel/filesystems/fat32/filesystem.cpp
index e37b6ce3..17d72b02 100644
--- a/kernel/kernel/filesystems/fat32/filesystem.cpp
+++ b/kernel/kernel/filesystems/fat32/filesystem.cpp
@@ -86,9 +86,11 @@ namespace kernel::filesystems::fat32
//! @return true on valid boot-sector, else false
auto validate_boot_sector(boot_sector const & bs) -> bool
{
- auto const fat_region_sectors = std::uint64_t{bs.number_of_fats} * bs.fat_size_32;
+ auto const fat_sectors = bs.fat_size_16 != 0 ? std::uint64_t{bs.fat_size_16} : bs.fat_size_32;
auto const total_sectors = bs.total_sectors_16 != 0 ? std::uint64_t{bs.total_sectors_16} : bs.total_sectors_32;
+ auto const fat_region_sectors = std::uint64_t{bs.number_of_fats} * fat_sectors;
+
return bs.bytes_per_sector >= constants::min_bytes_per_sector &&
bs.bytes_per_sector <= constants::max_bytes_per_sector && bs.reserved_sector_count > 0 &&
bs.number_of_fats > 0 && fat_region_sectors + bs.reserved_sector_count < total_sectors &&
@@ -152,9 +154,9 @@ namespace kernel::filesystems::fat32
return kstd::failure(errc::invalid_boot_sector);
}
- if (auto fat_type = get_fat_type(boot_sector); fat_type != fat_type::fat32)
+ if (get_fat_type(boot_sector) != fat_type::fat32)
{
- return kstd::failure(errc::invalid_boot_sector); // todo custom error
+ return kstd::failure(errc::unsupported_fat_fs); // todo custom error
}
return boot_sector;
diff --git a/kernel/kernel/filesystems/fat32/filesystem.tests.cpp b/kernel/kernel/filesystems/fat32/filesystem.tests.cpp
index ce267584..193ff7c3 100644
--- a/kernel/kernel/filesystems/fat32/filesystem.tests.cpp
+++ b/kernel/kernel/filesystems/fat32/filesystem.tests.cpp
@@ -121,13 +121,6 @@ SCENARIO("Fat32 filesystem mount validates the boot sector", "[filesystem][fat32
kernel::tests::filesystems::fat32::setup_mock_fat32_layout(*device, boot_sector);
REQUIRE(fs->mount(dev_inode).error() == kernel::filesystems::fat32::errc::invalid_boot_sector);
}
-
- THEN("more clusters than the file allocation table can describe are rejected")
- {
- boot_sector.total_sectors_32 = 1 + 1 + 127;
- kernel::tests::filesystems::fat32::setup_mock_fat32_layout(*device, boot_sector);
- REQUIRE(fs->mount(dev_inode).error() == kernel::filesystems::fat32::errc::invalid_boot_sector);
- }
}
}
@@ -167,7 +160,7 @@ SCENARIO_METHOD(kernel::tests::vfs::storage_boot_module_fixture, "Fat32 filesyst
THEN("probe accepts the boot sector")
{
- REQUIRE(fs->probe(dev_inode).error() == kernel::filesystems::fat32::errc::invalid_boot_sector);
+ REQUIRE(fs->probe(dev_inode).error() == kernel::filesystems::fat32::errc::unsupported_fat_fs);
}
}
@@ -185,7 +178,7 @@ SCENARIO_METHOD(kernel::tests::vfs::storage_boot_module_fixture, "Fat32 filesyst
THEN("probe accepts the boot sector")
{
- REQUIRE(fs->probe(dev_inode).error() == kernel::filesystems::fat32::errc::invalid_boot_sector);
+ REQUIRE(fs->probe(dev_inode).error() == kernel::filesystems::fat32::errc::unsupported_fat_fs);
}
}
}