summaryrefslogtreecommitdiff
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
parent004a0f10cf2ac6224e11881d178d8f617968f628 (diff)
Fixed asan errors
-rw-r--r--src/factories/BlobFactory.cpp1
-rw-r--r--src/factories/sm64/TrajectoryFactory.cpp15
-rw-r--r--src/utils/Decompressor.cpp72
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,