From 2985c395dfa8f3d090ecdcd7194ca75775b43919 Mon Sep 17 00:00:00 2001 From: Connor McLaughlin Date: Sat, 17 Apr 2021 20:20:09 +1000 Subject: [PATCH] GameList: Fix uninitialized fields of PSF/EXE --- src/core/psf_loader.cpp | 23 ++++++----------------- src/frontend-common/game_list.cpp | 2 +- src/frontend-common/game_list.h | 28 ++++++++++++++-------------- 3 files changed, 21 insertions(+), 32 deletions(-) diff --git a/src/core/psf_loader.cpp b/src/core/psf_loader.cpp index 33a01f54f..0e44ce6c4 100644 --- a/src/core/psf_loader.cpp +++ b/src/core/psf_loader.cpp @@ -59,27 +59,16 @@ float File::GetTagFloat(const char* tag_name, float default_value) const bool File::Load(const char* path) { - auto fp = FileSystem::OpenManagedCFile(path, "rb"); - if (!fp) + std::optional> file_data(FileSystem::ReadBinaryFile(path)); + if (!file_data.has_value() || file_data->empty()) { - Log_ErrorPrintf("Failed to open PSF file '%s'", path); + Log_ErrorPrintf("Failed to open/read PSF file '%s'", path); return false; } - // we could mmap this instead - std::fseek(fp.get(), 0, SEEK_END); - const u32 file_size = static_cast(std::ftell(fp.get())); - std::fseek(fp.get(), 0, SEEK_SET); - - std::vector file_data(file_size); - if (std::fread(file_data.data(), 1, file_size, fp.get()) != file_size) - { - Log_ErrorPrintf("Failed to read data from PSF '%s'", path); - return false; - } - - const u8* file_pointer = file_data.data(); - const u8* file_pointer_end = file_data.data() + file_data.size(); + const u8* file_pointer = file_data->data(); + const u8* file_pointer_end = file_data->data() + file_data->size(); + const u32 file_size = static_cast(file_data->size()); PSFHeader header; std::memcpy(&header, file_pointer, sizeof(header)); diff --git a/src/frontend-common/game_list.cpp b/src/frontend-common/game_list.cpp index 8e54adaba..180b584e6 100644 --- a/src/frontend-common/game_list.cpp +++ b/src/frontend-common/game_list.cpp @@ -122,7 +122,7 @@ bool GameList::GetPsfListEntry(const char* path, GameListEntry* entry) entry->code.clear(); entry->path = path; entry->region = file.GetRegion(); - entry->total_size = ffd.Size; + entry->total_size = static_cast(file.GetProgramData().size()); entry->last_modified_time = ffd.ModificationTime.AsUnixTimestamp(); entry->type = GameListEntryType::PSF; entry->compatibility_rating = GameListCompatibilityRating::Unknown; diff --git a/src/frontend-common/game_list.h b/src/frontend-common/game_list.h index a362089ab..bf0c25bb7 100644 --- a/src/frontend-common/game_list.h +++ b/src/frontend-common/game_list.h @@ -1,7 +1,7 @@ #pragma once #include "core/types.h" -#include "game_settings.h" #include "game_database.h" +#include "game_settings.h" #include #include #include @@ -37,8 +37,8 @@ enum class GameListCompatibilityRating struct GameListEntry { - GameListEntryType type; - DiscRegion region; + GameListEntryType type = GameListEntryType::Disc; + DiscRegion region = DiscRegion::Other; std::string path; std::string code; @@ -46,17 +46,17 @@ struct GameListEntry std::string genre; std::string publisher; std::string developer; - u64 total_size; - u64 last_modified_time; + u64 total_size = 0; + u64 last_modified_time = 0; - u64 release_date; - u32 supported_controllers; - u8 min_players; - u8 max_players; - u8 min_blocks; - u8 max_blocks; + u64 release_date = 0; + u32 supported_controllers = ~static_cast(0); + u8 min_players = 1; + u8 max_players = 1; + u8 min_blocks = 0; + u8 max_blocks = 0; - GameListCompatibilityRating compatibility_rating; + GameListCompatibilityRating compatibility_rating = GameListCompatibilityRating::Unknown; GameSettings::Entry settings; size_t GetReleaseDateString(char* buffer, size_t buffer_size) const; @@ -69,8 +69,8 @@ struct GameListCompatibilityEntry std::string version_tested; std::string upscaling_issues; std::string comments; - DiscRegion region; - GameListCompatibilityRating compatibility_rating; + DiscRegion region = DiscRegion::Other; + GameListCompatibilityRating compatibility_rating = GameListCompatibilityRating::Unknown; }; class GameList