diff --git a/Source/Core/DiscIO/TGCBlob.cpp b/Source/Core/DiscIO/TGCBlob.cpp index 71d43e76da..a7c6b37cce 100644 --- a/Source/Core/DiscIO/TGCBlob.cpp +++ b/Source/Core/DiscIO/TGCBlob.cpp @@ -73,7 +73,7 @@ TGCFileReader::TGCFileReader(File::IOFile file) : m_file(std::move(file)) m_file.ReadArray(&m_header, 1); u32 header_size = Common::swap32(m_header.tgc_header_size); m_size = m_file.GetSize(); - m_file_area_shift = Common::swap32(m_header.file_area_virtual_offset) - + m_file_area_shift = static_cast(Common::swap32(m_header.file_area_virtual_offset)) - Common::swap32(m_header.file_area_real_offset) + header_size; } @@ -85,14 +85,18 @@ u64 TGCFileReader::GetDataSize() const bool TGCFileReader::Read(u64 offset, u64 nbytes, u8* out_ptr) { - Interval first_part; - Interval empty_part; - Interval file_part; + Interval first_part = {0, 0}; + Interval empty_part = {0, 0}; + Interval file_part = {0, 0}; const u32 tgc_header_size = Common::swap32(m_header.tgc_header_size); const u64 split_point = Common::swap32(m_header.file_area_real_offset) - tgc_header_size; SplitInterval(split_point, Interval{offset, nbytes}, &first_part, &file_part); - SplitInterval(m_file_area_shift - tgc_header_size, file_part, &empty_part, &file_part); + if (m_file_area_shift > tgc_header_size) + { + SplitInterval(static_cast(m_file_area_shift - tgc_header_size), file_part, &empty_part, + &file_part); + } // Offsets in the initial areas of the disc are unshifted // (except for InternalRead's constant shift by tgc_header_size). diff --git a/Source/Core/DiscIO/TGCBlob.h b/Source/Core/DiscIO/TGCBlob.h index 0816d27e3b..31a46fca00 100644 --- a/Source/Core/DiscIO/TGCBlob.h +++ b/Source/Core/DiscIO/TGCBlob.h @@ -55,7 +55,7 @@ private: File::IOFile m_file; u64 m_size; - u64 m_file_area_shift; + s64 m_file_area_shift; // Stored as big endian in memory, regardless of the host endianness TGCHeader m_header = {};