summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorScott Mansell <phiren@gmail.com>2026-07-26 18:15:07 +1200
committerOatmealDome <julian@oatmealdome.me>2026-08-10 17:50:26 -0400
commit8f1e33a5f47dc350dc32f168252ecb2eba9ed2a2 (patch)
tree86cabaf0df4b2aef3a1405c8d7f5883eff0ad8ee /Source/Core
parent2f5232fbf4c6b5856523e69b0634e36715981716 (diff)
GCZ: Don't trust block_num either
SectorReader::ReadChunk does do some validation on it, but it only checks against the original disc size (reported by the GCZ file). It has no idea how many blocks the header claimed the disc had. A maliciously crafted GCZ file could trigger read overflows off the end of the m_block_pointers/m_hashes arrays.
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/DiscIO/CompressedBlob.cpp3
1 files changed, 3 insertions, 0 deletions
diff --git a/Source/Core/DiscIO/CompressedBlob.cpp b/Source/Core/DiscIO/CompressedBlob.cpp
index eae4d4ccaf..036e139d0b 100644
--- a/Source/Core/DiscIO/CompressedBlob.cpp
+++ b/Source/Core/DiscIO/CompressedBlob.cpp
@@ -94,6 +94,9 @@ u64 CompressedBlobReader::GetBlockCompressedSize(u64 block_num) const
bool CompressedBlobReader::GetBlock(u64 block_num, u8* out_ptr)
{
+ if (block_num >= m_header.num_blocks)
+ return false;
+
bool uncompressed = false;
u64 read_size = GetBlockCompressedSize(block_num);
u64 offset = m_block_pointers[block_num] + m_data_offset;