From 9abc5763b6ade0f3e7e6b3542f45bb867a634bba Mon Sep 17 00:00:00 2001 From: Lioncash Date: Wed, 18 Jul 2018 23:25:07 -0400 Subject: 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 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) (limited to 'src/core/file_sys/partition_filesystem.cpp') 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) { - status = Loader::ResultStatus::Error; - return; - } - - size_t total_size = file_data.size(); - if (total_size < sizeof(Header)) { + if (total_size != metadata_size) { 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; -- cgit v1.2.3