summaryrefslogtreecommitdiff
path: root/src/utils/Decompressor.cpp
diff options
context:
space:
mode:
authorJeod <47716344+JeodC@users.noreply.github.com>2026-07-21 07:51:22 -0400
committerLywx <kiritodev01@gmail.com>2026-07-21 10:28:15 -0600
commit6e9ee0aaffb6f338551d9fc8fd447e1fe5a03603 (patch)
tree1e7326617ccc92d5d92bebf006d614c8e094354e /src/utils/Decompressor.cpp
parent4c8ef537bffe99e55e2087a4f938f1ddb35de815 (diff)
BK: Add romhack guards for extraction and soundfontctl factory
Diffstat (limited to 'src/utils/Decompressor.cpp')
-rw-r--r--src/utils/Decompressor.cpp19
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;