From 6e9ee0aaffb6f338551d9fc8fd447e1fe5a03603 Mon Sep 17 00:00:00 2001 From: Jeod <47716344+JeodC@users.noreply.github.com> Date: Tue, 21 Jul 2026 07:51:22 -0400 Subject: BK: Add romhack guards for extraction and soundfontctl factory --- src/utils/Decompressor.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'src/utils/Decompressor.cpp') diff --git a/src/utils/Decompressor.cpp b/src/utils/Decompressor.cpp index f9c800c..c591f6c 100644 --- a/src/utils/Decompressor.cpp +++ b/src/utils/Decompressor.cpp @@ -228,7 +228,19 @@ DecompressedData Decompressor::AutoDecode(YAML::Node& node, std::vector } auto decoded = Decode(buffer, fileOffset, type, sizeEntry.value()); + // Rom data can reference offsets past the decoded file; clamp instead of + // letting decoded->size - offsetFromFile underflow into a giant bogus segment. + if (offsetFromFile > decoded->size) { + SPDLOG_WARN("AutoDecode BKZIP: offset 0x{:X} lies past decoded size 0x{:X}; clamping to empty segment", + offsetFromFile, decoded->size); + offsetFromFile = decoded->size; + } auto size = node["size"] ? node["size"].as() : manualSize.value_or(decoded->size - offsetFromFile); + if (size > decoded->size - offsetFromFile) { + SPDLOG_WARN("AutoDecode BKZIP: requested size 0x{:X} exceeds available 0x{:X}; reducing", size, + decoded->size - offsetFromFile); + size = decoded->size - offsetFromFile; + } SPDLOG_INFO("AutoDecode BKZIP: offset=0x{:X} fileOffset=0x{:X} offsetFromFile=0x{:X} compSize=0x{:X} " "decodedSize=0x{:X} segSize=0x{:X}", offset, fileOffset, offsetFromFile, sizeEntry.value(), decoded->size, size); @@ -241,6 +253,13 @@ DecompressedData Decompressor::AutoDecode(YAML::Node& node, std::vector { fileOffset = TranslateAddr(offset, false); + // An offset past the file must not underflow availableSize. + if (fileOffset > buffer.size()) { + SPDLOG_WARN("AutoDecode: offset 0x{:X} lies past file size 0x{:X}; clamping to empty segment", + fileOffset, buffer.size()); + fileOffset = buffer.size(); + } + auto availableSize = buffer.size() - fileOffset; size_t size; -- cgit v1.2.3