Merge pull request #8855 from shuffle2/dol

DolReader: treat overly large data segment as bss
This commit is contained in:
LC 2020-08-16 06:02:39 -04:00 committed by GitHub
commit 6fc7135047
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -32,7 +32,7 @@ DolReader::~DolReader() = default;
bool DolReader::Initialize(const std::vector<u8>& buffer)
{
if (buffer.size() < sizeof(SDolHeader))
if (buffer.size() < sizeof(SDolHeader) || buffer.size() > UINT32_MAX)
return false;
memcpy(&m_dolheader, buffer.data(), sizeof(SDolHeader));
@ -77,11 +77,16 @@ bool DolReader::Initialize(const std::vector<u8>& buffer)
{
if (m_dolheader.dataSize[i] != 0)
{
if (buffer.size() < m_dolheader.dataOffset[i] + m_dolheader.dataSize[i])
u32 section_size = m_dolheader.dataSize[i];
u32 section_offset = m_dolheader.dataOffset[i];
if (buffer.size() < section_offset)
return false;
const u8* data_start = &buffer[m_dolheader.dataOffset[i]];
m_data_sections.emplace_back(data_start, &data_start[m_dolheader.dataSize[i]]);
std::vector<u8> data(section_size);
const u8* data_start = &buffer[section_offset];
std::memcpy(&data[0], data_start,
std::min((size_t)section_size, buffer.size() - section_offset));
m_data_sections.emplace_back(data);
}
else
{