Pārlūkot izejas kodu

Add clamping logic (#6149)

Co-authored-by: Kim Kulling <[email protected]>
Martin Mirchev 2 mēneši atpakaļ
vecāks
revīzija
18465fbb24
1 mainītis faili ar 30 papildinājumiem un 4 dzēšanām
  1. 30 4
      code/AssetLib/FBX/FBXExporter.cpp

+ 30 - 4
code/AssetLib/FBX/FBXExporter.cpp

@@ -1043,14 +1043,40 @@ aiMatrix4x4 get_world_transform(const aiNode* node, const aiScene* scene) {
 }
 
 inline int64_t to_ktime(double ticks, const aiAnimation* anim) {
-    if (FP_ZERO == std::fpclassify(anim->mTicksPerSecond)) {
-        return static_cast<int64_t>(ticks) * FBX::SECOND;
+    // Defensive: handle zero or near-zero mTicksPerSecond
+    double tps = anim->mTicksPerSecond;
+    double timeVal;
+    if (FP_ZERO == std::fpclassify(tps)) {
+        timeVal = ticks;
+    } else {
+        timeVal = ticks / tps;
+    }
+
+    // Clamp to prevent overflow
+    const double kMax = static_cast<double>(INT64_MAX) / static_cast<double>(FBX::SECOND);
+    const double kMin = static_cast<double>(INT64_MIN) / static_cast<double>(FBX::SECOND);
+
+    if (timeVal > kMax) {
+        return INT64_MAX;
     }
-    return (static_cast<int64_t>(ticks / anim->mTicksPerSecond)) * FBX::SECOND;
+    if (timeVal < kMin) {
+        return INT64_MIN;
+    }
+    return static_cast<int64_t>(timeVal * FBX::SECOND);
 }
 
 inline int64_t to_ktime(double time) {
-    return (static_cast<int64_t>(time * FBX::SECOND));
+    // Clamp to prevent overflow
+    const double kMax = static_cast<double>(INT64_MAX) / static_cast<double>(FBX::SECOND);
+    const double kMin = static_cast<double>(INT64_MIN) / static_cast<double>(FBX::SECOND);
+
+    if (time > kMax) {
+        return INT64_MAX;
+    }
+    if (time < kMin) {
+        return INT64_MIN;
+    }
+    return static_cast<int64_t>(time * FBX::SECOND);
 }
 
 void FBXExporter::WriteObjects () {