diff options
| author | KiritoDv <kiritodev01@gmail.com> | 2026-01-07 20:49:09 -0600 |
|---|---|---|
| committer | Lywx <kiritodev01@gmail.com> | 2026-01-14 19:25:57 -0600 |
| commit | 4367716cdaf0c84ebe0b5cb63435eb5d1928f4a8 (patch) | |
| tree | 02a0f9059ee6b8d44a386c02982534a8690dd566 /src/utils/Decompressor.cpp | |
| parent | 004a0f10cf2ac6224e11881d178d8f617968f628 (diff) | |
Fixed asan errors
Diffstat (limited to 'src/utils/Decompressor.cpp')
| -rw-r--r-- | src/utils/Decompressor.cpp | 72 |
1 files changed, 65 insertions, 7 deletions
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<uint8_t> offset = ASSET_PTR(offset); auto decoded = Decode(buffer, fileOffset + offset, CompressionType::MIO0); - auto size = node["size"] ? node["size"].as<size_t>() : manualSize.value_or(decoded->size); + size_t decodedSize = decoded->size - offset; + size_t size; + + if (node["size"]) { + size = node["size"].as<size_t>(); + } 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<uint8_t> auto fileOffset = TranslateAddr(offset, true); offset = ASSET_PTR(offset); - auto decoded = DecodeTKMK00(buffer, fileOffset + offset, textureSize, alpha); - auto size = node["size"] ? node["size"].as<size_t>() : 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<size_t>(); + } 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<uint8_t> auto decoded = Decode(buffer, fileOffset, type); auto availableSize = decoded->size - offset; - auto size = node["size"] ? node["size"].as<size_t>() : std::min(manualSize.value_or(availableSize), availableSize); + size_t size; + + if (node["size"]) { + size = node["size"].as<size_t>(); + } 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<uint8_t> fileOffset = TranslateAddr(offset, false); auto availableSize = buffer.size() - fileOffset; - auto size = node["size"] ? node["size"].as<size_t>() : std::min(manualSize.value_or(availableSize), availableSize); + size_t size; + + if (node["size"]) { + size = node["size"].as<size_t>(); + } 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, |
