diff options
| author | Jeod <47716344+JeodC@users.noreply.github.com> | 2026-07-21 07:51:22 -0400 |
|---|---|---|
| committer | Lywx <kiritodev01@gmail.com> | 2026-07-21 10:28:15 -0600 |
| commit | 6e9ee0aaffb6f338551d9fc8fd447e1fe5a03603 (patch) | |
| tree | 1e7326617ccc92d5d92bebf006d614c8e094354e /src/utils | |
| parent | 4c8ef537bffe99e55e2087a4f938f1ddb35de815 (diff) | |
BK: Add romhack guards for extraction and soundfontctl factory
Diffstat (limited to 'src/utils')
| -rw-r--r-- | src/utils/Decompressor.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
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<uint8_t> } 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<size_t>() : 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<uint8_t> { 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; |
