From c540c6f00556d45ee957e06c788da5b6d33b4cb8 Mon Sep 17 00:00:00 2001 From: bbuerge Date: Thu, 29 Oct 2026 15:49:35 +0000 Subject: kernel/filesystem: custom err code unsupported fs, fix validate --- kernel/kernel/filesystems/fat32/error.cpp | 3 +++ kernel/kernel/filesystems/fat32/error.hpp | 1 + kernel/kernel/filesystems/fat32/filesystem.cpp | 8 +++++--- kernel/kernel/filesystems/fat32/filesystem.tests.cpp | 11 ++--------- 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); } } } -- cgit v1.2.3