diff --git a/Kernel/FileSystem/FATFS/FileSystem.cpp b/Kernel/FileSystem/FATFS/FileSystem.cpp index bcec7c5492..9580f72132 100644 --- a/Kernel/FileSystem/FATFS/FileSystem.cpp +++ b/Kernel/FileSystem/FATFS/FileSystem.cpp @@ -239,6 +239,24 @@ ErrorOr FATFS::initialize_while_locked() root_entry.attributes = FATAttributes::Directory; m_root_inode = TRY(FATInode::create(*this, root_entry, { 0, 1 })); + if (m_fat_version == FATVersion::FAT32) { + auto fs_info_buffer = UserOrKernelBuffer::for_kernel_buffer(bit_cast(&m_fs_info)); + // We know that there is a DOS7 BPB, because if it wasn't present + // we would have returned EINVAL above. + TRY(read_block(ebpb.dos7_bpb()->fs_info_sector, &fs_info_buffer, sizeof(m_fs_info))); + + if (m_fs_info.lead_signature != fs_info_signature_1 || m_fs_info.struct_signature != fs_info_signature_2 || m_fs_info.trailing_signature != fs_info_signature_3) { + dbgln("FATFS: Invalid FSInfo struct signature"); + dbgln_if(FAT_DEBUG, "FATFS: FSInfo signature1: {:#x}, expected: {:#x}", m_fs_info.lead_signature, fs_info_signature_1); + dbgln_if(FAT_DEBUG, "FATFS: FSInfo signature2: {:#x}, expected: {:#x}", m_fs_info.struct_signature, fs_info_signature_2); + dbgln_if(FAT_DEBUG, "FATFS: FSInfo signature3: {:#x}, expected: {:#x}", m_fs_info.trailing_signature, fs_info_signature_3); + return Error::from_errno(EINVAL); + } + + dbgln_if(FAT_DEBUG, "FATFS: fs_info.last_known_free_cluster_count: {}", m_fs_info.last_known_free_cluster_count); + dbgln_if(FAT_DEBUG, "FATFS: fs_info.next_free_cluster_hint: {}", m_fs_info.next_free_cluster_hint); + } + return {}; } diff --git a/Kernel/FileSystem/FATFS/FileSystem.h b/Kernel/FileSystem/FATFS/FileSystem.h index c4ed216104..fe5a0c7abb 100644 --- a/Kernel/FileSystem/FATFS/FileSystem.h +++ b/Kernel/FileSystem/FATFS/FileSystem.h @@ -78,6 +78,10 @@ private: static constexpr u8 signature_1 = 0x28; static constexpr u8 signature_2 = 0x29; + static constexpr u32 fs_info_signature_1 = 0x41615252; + static constexpr u32 fs_info_signature_2 = 0x61417272; + static constexpr u32 fs_info_signature_3 = 0xAA550000; + static constexpr u32 first_data_cluster = 2; FatBlockSpan first_block_of_cluster(u32 cluster) const; @@ -91,6 +95,7 @@ private: ErrorOr fat_write(u32 cluster, u32 value); OwnPtr m_boot_record; + FAT32FSInfo m_fs_info; OwnPtr m_parameter_block; RefPtr m_root_inode; u32 m_first_data_sector { 0 };