From 9abc5763b6ade0f3e7e6b3542f45bb867a634bba Mon Sep 17 00:00:00 2001 From: Lioncash Date: Wed, 18 Jul 2018 23:25:07 -0400 Subject: [PATCH] partition_filesystem: Ensure all class members of PartitionFilesystem are initialized Previously is_hfs and pfs_header members wouldn't be initialized in the constructor, as they were stored in locals instead. This would result in things like GetName() and PrintDebugInfo() behaving incorrectly. While we're at it, initialize the members to deterministic values as well, in case loading ever fails. --- src/core/file_sys/partition_filesystem.cpp | 29 +++++++--------------- src/core/file_sys/partition_filesystem.h | 10 +++++--- 2 files changed, 15 insertions(+), 24 deletions(-) diff --git a/src/core/file_sys/partition_filesystem.cpp b/src/core/file_sys/partition_filesystem.cpp index 15b1fb9462..d4097a5107 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 9656b40bfd..7c7a75816c 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;