summaryrefslogtreecommitdiff
path: root/src/utils
diff options
context:
space:
mode:
authorKiritoDv <kiritodev01@gmail.com>2026-01-07 20:49:09 -0600
committerLywx <kiritodev01@gmail.com>2026-01-14 19:25:57 -0600
commit4367716cdaf0c84ebe0b5cb63435eb5d1928f4a8 (patch)
tree02a0f9059ee6b8d44a386c02982534a8690dd566 /src/utils
parent004a0f10cf2ac6224e11881d178d8f617968f628 (diff)
Fixed asan errors
Diffstat (limited to 'src/utils')
-rw-r--r--src/utils/Decompressor.cpp72
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,