diff --git a/src/core/file_sys/partition_filesystem.cpp b/src/core/file_sys/partition_filesystem.cpp index 15b1fb946..d4097a510 100644 --- a/src/core/file_sys/partition_filesystem.cpp +++ b/src/core/file_sys/partition_filesystem.cpp @@ -11,6 +11,11 @@ namespace FileSys { +bool PartitionFilesystem::Header::HasValidMagicValue() const { + return magic == Common::MakeMagic('H', 'F', 'S', '0') || + magic == Common::MakeMagic('P', 'F', 'S', '0'); +} + PartitionFilesystem::PartitionFilesystem(std::shared_ptr file) { // At least be as large as the header if (file->GetSize() < sizeof(Header)) { @@ -20,19 +25,17 @@ PartitionFilesystem::PartitionFilesystem(std::shared_ptr file) { // For cartridges, HFSs can get very large, so we need to calculate the size up to // the actual content itself instead of just blindly reading in the entire file. - Header pfs_header; if (sizeof(Header) != file->ReadObject(&pfs_header)) { status = Loader::ResultStatus::Error; return; } - if (pfs_header.magic != Common::MakeMagic('H', 'F', 'S', '0') && - pfs_header.magic != Common::MakeMagic('P', 'F', 'S', '0')) { + if (!pfs_header.HasValidMagicValue()) { status = Loader::ResultStatus::ErrorInvalidFormat; return; } - bool is_hfs = pfs_header.magic == Common::MakeMagic('H', 'F', 'S', '0'); + is_hfs = pfs_header.magic == Common::MakeMagic('H', 'F', 'S', '0'); size_t entry_size = is_hfs ? sizeof(HFSEntry) : sizeof(PFSEntry); size_t metadata_size = @@ -40,27 +43,13 @@ PartitionFilesystem::PartitionFilesystem(std::shared_ptr file) { // Actually read in now... std::vector file_data = file->ReadBytes(metadata_size); + const size_t total_size = file_data.size(); - if (file_data.size() != metadata_size) { + if (total_size != metadata_size) { status = Loader::ResultStatus::Error; return; } - size_t total_size = file_data.size(); - if (total_size < sizeof(Header)) { - status = Loader::ResultStatus::Error; - return; - } - - memcpy(&pfs_header, file_data.data(), sizeof(Header)); - if (pfs_header.magic != Common::MakeMagic('H', 'F', 'S', '0') && - pfs_header.magic != Common::MakeMagic('P', 'F', 'S', '0')) { - status = Loader::ResultStatus::ErrorInvalidFormat; - return; - } - - is_hfs = pfs_header.magic == Common::MakeMagic('H', 'F', 'S', '0'); - size_t entries_offset = sizeof(Header); size_t strtab_offset = entries_offset + (pfs_header.num_entries * entry_size); content_offset = strtab_offset + pfs_header.strtab_size; diff --git a/src/core/file_sys/partition_filesystem.h b/src/core/file_sys/partition_filesystem.h index 9656b40bf..7c7a75816 100644 --- a/src/core/file_sys/partition_filesystem.h +++ b/src/core/file_sys/partition_filesystem.h @@ -42,6 +42,8 @@ private: u32_le num_entries; u32_le strtab_size; INSERT_PADDING_BYTES(0x4); + + bool HasValidMagicValue() const; }; static_assert(sizeof(Header) == 0x10, "PFS/HFS header structure size is wrong"); @@ -73,11 +75,11 @@ private: #pragma pack(pop) - Loader::ResultStatus status; + Loader::ResultStatus status{}; - Header pfs_header; - bool is_hfs; - size_t content_offset; + Header pfs_header{}; + bool is_hfs = false; + size_t content_offset = 0; std::vector pfs_files; std::vector pfs_dirs;