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 | |
| parent | 004a0f10cf2ac6224e11881d178d8f617968f628 (diff) | |
Fixed asan errors
Diffstat (limited to 'src')
| -rw-r--r-- | src/factories/BlobFactory.cpp | 1 | ||||
| -rw-r--r-- | src/factories/sm64/TrajectoryFactory.cpp | 15 | ||||
| -rw-r--r-- | src/utils/Decompressor.cpp | 72 |
3 files changed, 76 insertions, 12 deletions
diff --git a/src/factories/BlobFactory.cpp b/src/factories/BlobFactory.cpp index 85f1558..8f6830b 100644 --- a/src/factories/BlobFactory.cpp +++ b/src/factories/BlobFactory.cpp @@ -56,7 +56,6 @@ ExportResult BlobBinaryExporter::Export(std::ostream &write, std::shared_ptr<IPa } std::optional<std::shared_ptr<IParsedData>> BlobFactory::parse(std::vector<uint8_t>& buffer, YAML::Node& node) { - auto size = GetSafeNode<size_t>(node, "size"); auto [_, segment] = Decompressor::AutoDecode(node, buffer); return std::make_shared<RawBuffer>(segment.data, segment.size); } diff --git a/src/factories/sm64/TrajectoryFactory.cpp b/src/factories/sm64/TrajectoryFactory.cpp index 6e47488..5e43f93 100644 --- a/src/factories/sm64/TrajectoryFactory.cpp +++ b/src/factories/sm64/TrajectoryFactory.cpp @@ -28,15 +28,17 @@ ExportResult SM64::TrajectoryCodeExporter::Export(std::ostream &write, std::shar for (auto &trajectory : trajectoryData) { write << fourSpaceTab; + if(trajectory.trajId == -1) { + write << "TRAJECTORY_END(),\n"; + break; + } write << "TRAJECTORY_POS("; write << trajectory.trajId << ", " << trajectory.posX << ", " << trajectory.posY << ", " << trajectory.posZ << "),\n"; } - write << fourSpaceTab << "TRAJECTORY_END(),"; - write << "\n};\n"; - size_t size = (trajectoryData.size()) * sizeof(Trajectory) + 1; + size_t size = (trajectoryData.size()) * sizeof(Trajectory); return offset + size; } @@ -64,13 +66,16 @@ std::optional<std::shared_ptr<IParsedData>> SM64::TrajectoryFactory::parse(std:: std::vector<Trajectory> trajectoryData; auto [_, segment] = Decompressor::AutoDecode(node, buffer); LUS::BinaryReader reader(segment.data, segment.size); + + SPDLOG_INFO("Parsing MIO0 Trajectory Data, size: {}", segment.size); + reader.SetEndianness(Torch::Endianness::Big); bool isRunning = true; while (isRunning) { auto trajId = reader.ReadInt16(); if (trajId == -1) { - isRunning = false; + break; } auto posX = reader.ReadInt16(); auto posY = reader.ReadInt16(); @@ -78,5 +83,7 @@ std::optional<std::shared_ptr<IParsedData>> SM64::TrajectoryFactory::parse(std:: trajectoryData.emplace_back(trajId, posX, posY, posZ); } + trajectoryData.emplace_back(-1, 0, 0, 0); // End marker + return std::make_shared<SM64::TrajectoryData>(trajectoryData); } 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, |
