From 4367716cdaf0c84ebe0b5cb63435eb5d1928f4a8 Mon Sep 17 00:00:00 2001 From: KiritoDv Date: Wed, 7 Jan 2026 20:49:09 -0600 Subject: Fixed asan errors --- src/utils/Decompressor.cpp | 72 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 65 insertions(+), 7 deletions(-) (limited to 'src/utils/Decompressor.cpp') diff --git a/src/utils/Decompressor.cpp b/src/utils/Decompressor.cpp index dd24650..934a84f 100644 --- a/src/utils/Decompressor.cpp +++ b/src/utils/Decompressor.cpp @@ -90,10 +90,25 @@ DecompressedData Decompressor::AutoDecode(YAML::Node& node, std::vector offset = ASSET_PTR(offset); auto decoded = Decode(buffer, fileOffset + offset, CompressionType::MIO0); - auto size = node["size"] ? node["size"].as() : manualSize.value_or(decoded->size); + size_t decodedSize = decoded->size - offset; + size_t size; + + if (node["size"]) { + size = node["size"].as(); + } else if (manualSize.has_value()) { + size = manualSize.value(); + } else { + size = decodedSize; + } + + if(size > decodedSize) { + SPDLOG_WARN("Requested size 0x{:X} exceeds decoded MIO0 asset size 0x{:X} at offset 0x{:X}. Reducing to available size.", size, decodedSize, assetPtr); + size = decodedSize; + } + return { - .root = decoded, - .segment = { decoded->data, size } + .root = decoded, + .segment = { decoded->data, size } }; } @@ -107,8 +122,24 @@ DecompressedData Decompressor::AutoDecode(YAML::Node& node, std::vector auto fileOffset = TranslateAddr(offset, true); offset = ASSET_PTR(offset); - auto decoded = DecodeTKMK00(buffer, fileOffset + offset, textureSize, alpha); - auto size = node["size"] ? node["size"].as() : manualSize.value_or(decoded->size); + auto assetPtr = fileOffset + offset; + auto decoded = DecodeTKMK00(buffer, assetPtr, textureSize, alpha); + size_t decodedSize = decoded->size - offset; + size_t size; + + if (node["size"]) { + size = node["size"].as(); + } else if (manualSize.has_value()) { + size = manualSize.value(); + } else { + size = decodedSize; + } + + if(size > decodedSize) { + SPDLOG_WARN("Requested size 0x{:X} exceeds decoded TKMK00 asset size 0x{:X} at offset 0x{:X}. Reducing to available size.", size, decodedSize, assetPtr); + size = decodedSize; + } + return { .root = decoded, .segment = { decoded->data, size } @@ -124,7 +155,21 @@ DecompressedData Decompressor::AutoDecode(YAML::Node& node, std::vector auto decoded = Decode(buffer, fileOffset, type); auto availableSize = decoded->size - offset; - auto size = node["size"] ? node["size"].as() : std::min(manualSize.value_or(availableSize), availableSize); + size_t size; + + if (node["size"]) { + size = node["size"].as(); + } else if (manualSize.has_value()) { + size = manualSize.value(); + } else { + size = availableSize; + } + + if(size > availableSize) { + SPDLOG_WARN("Requested size 0x{:X} exceeds decoded asset size 0x{:X} at offset 0x{:X}. Reducing to available size.", size, availableSize, fileOffset); + size = availableSize; + } + return { .root = decoded, .segment = { decoded->data + offset, size } @@ -137,7 +182,20 @@ DecompressedData Decompressor::AutoDecode(YAML::Node& node, std::vector fileOffset = TranslateAddr(offset, false); auto availableSize = buffer.size() - fileOffset; - auto size = node["size"] ? node["size"].as() : std::min(manualSize.value_or(availableSize), availableSize); + size_t size; + + if (node["size"]) { + size = node["size"].as(); + } else if (manualSize.has_value()) { + size = manualSize.value(); + } else { + size = availableSize; + } + + if(size > availableSize) { + SPDLOG_WARN("Requested size 0x{:X} exceeds available asset size 0x{:X} at offset 0x{:X}. Reducing to available size.", size, availableSize, fileOffset); + size = availableSize; + } return { .root = nullptr, -- cgit v1.2.3