System: Add a workaround for PSF files with incorrect header

This commit is contained in:
Connor McLaughlin 2021-11-06 10:48:23 +10:00
parent 0adbfcbb1f
commit 946481c2aa
2 changed files with 17 additions and 11 deletions

View file

@ -247,7 +247,10 @@ bool IsValidPSExeHeader(const PSEXEHeader& header, u32 file_size)
return false; return false;
if ((header.file_size + sizeof(PSEXEHeader)) > file_size) if ((header.file_size + sizeof(PSEXEHeader)) > file_size)
return false; {
Log_WarningPrintf("Incorrect file size in PS-EXE header: %u bytes should not be greater than %u bytes",
header.file_size, file_size - sizeof(PSEXEHeader));
}
return true; return true;
} }

View file

@ -1659,16 +1659,17 @@ static bool LoadEXEToRAM(const char* filename, bool patch_bios)
} }
} }
if (header.file_size >= 4) const u32 file_data_size = std::min<u32>(file_size - sizeof(BIOS::PSEXEHeader), header.file_size);
if (file_data_size >= 4)
{ {
std::vector<u32> data_words((header.file_size + 3) / 4); std::vector<u32> data_words((file_data_size + 3) / 4);
if (std::fread(data_words.data(), header.file_size, 1, fp) != 1) if (std::fread(data_words.data(), file_data_size, 1, fp) != 1)
{ {
std::fclose(fp); std::fclose(fp);
return false; return false;
} }
const u32 num_words = header.file_size / 4; const u32 num_words = file_data_size / 4;
u32 address = header.load_address; u32 address = header.load_address;
for (u32 i = 0; i < num_words; i++) for (u32 i = 0; i < num_words; i++)
{ {
@ -1711,7 +1712,8 @@ bool InjectEXEFromBuffer(const void* buffer, u32 buffer_size, bool patch_bios)
std::memcpy(&header, buffer_ptr, sizeof(header)); std::memcpy(&header, buffer_ptr, sizeof(header));
buffer_ptr += sizeof(header); buffer_ptr += sizeof(header);
if (!BIOS::IsValidPSExeHeader(header, static_cast<u32>(buffer_end - buffer_ptr))) const u32 file_size = static_cast<u32>(static_cast<u32>(buffer_end - buffer_ptr));
if (!BIOS::IsValidPSExeHeader(header, file_size))
return false; return false;
if (header.memfill_size > 0) if (header.memfill_size > 0)
@ -1725,15 +1727,16 @@ bool InjectEXEFromBuffer(const void* buffer, u32 buffer_size, bool patch_bios)
} }
} }
if (header.file_size >= 4) const u32 file_data_size = std::min<u32>(file_size - sizeof(BIOS::PSEXEHeader), header.file_size);
if (file_data_size >= 4)
{ {
std::vector<u32> data_words((header.file_size + 3) / 4); std::vector<u32> data_words((file_data_size + 3) / 4);
if ((buffer_end - buffer_ptr) < header.file_size) if ((buffer_end - buffer_ptr) < file_data_size)
return false; return false;
std::memcpy(data_words.data(), buffer_ptr, header.file_size); std::memcpy(data_words.data(), buffer_ptr, file_data_size);
const u32 num_words = header.file_size / 4; const u32 num_words = file_data_size / 4;
u32 address = header.load_address; u32 address = header.load_address;
for (u32 i = 0; i < num_words; i++) for (u32 i = 0; i < num_words; i++)
{ {