[Bf-blender-cvs] [87b77a97b94] blender-v2.93-release: Fix dna_genfile error converting signed int types to floating point

Campbell Barton noreply at git.blender.org
Tue Feb 22 10:27:11 CET 2022


Commit: 87b77a97b947a3d799fc5aa6ac7d2c5e5606109b
Author: Campbell Barton
Date:   Tue Feb 8 11:50:15 2022 +1100
Branches: blender-v2.93-release
https://developer.blender.org/rB87b77a97b947a3d799fc5aa6ac7d2c5e5606109b

Fix dna_genfile error converting signed int types to floating point

Regression in 51befa4108128a7bacf7a201046cf7ede999833a
caused negative values to overflow into a uint64_t.

Resolve by casting to a signed int from originally signed types.

This caused D14033 not to work properly.

===================================================================

M	source/blender/makesdna/intern/dna_genfile.c

===================================================================

diff --git a/source/blender/makesdna/intern/dna_genfile.c b/source/blender/makesdna/intern/dna_genfile.c
index f7f3d8e0eb4..c4958f1374c 100644
--- a/source/blender/makesdna/intern/dna_genfile.c
+++ b/source/blender/makesdna/intern/dna_genfile.c
@@ -752,6 +752,9 @@ static void cast_primitive_type(const eSDNA_Type old_type,
   const int curlen = DNA_elem_type_size(new_type);
 
   double old_value_f = 0.0;
+  /* Intentionally overflow signed values into an unsigned type.
+   * Casting back to a signed value preserves the sign (when the new value is signed).
+   * It's also important to cast to `int64_t` when setting `old_value_f` from a signed value. */
   uint64_t old_value_i = 0;
 
   for (int a = 0; a < array_len; a++) {
@@ -771,7 +774,7 @@ static void cast_primitive_type(const eSDNA_Type old_type,
       case SDNA_TYPE_SHORT: {
         const short value = *((short *)old_data);
         old_value_i = value;
-        old_value_f = (double)old_value_i;
+        old_value_f = (double)(int64_t)old_value_i;
         break;
       }
       case SDNA_TYPE_USHORT: {
@@ -783,7 +786,7 @@ static void cast_primitive_type(const eSDNA_Type old_type,
       case SDNA_TYPE_INT: {
         const int value = *((int *)old_data);
         old_value_i = value;
-        old_value_f = (double)old_value_i;
+        old_value_f = (double)(int64_t)old_value_i;
         break;
       }
       case SDNA_TYPE_FLOAT: {
@@ -801,7 +804,7 @@ static void cast_primitive_type(const eSDNA_Type old_type,
       case SDNA_TYPE_INT64: {
         const int64_t value = *((int64_t *)old_data);
         old_value_i = (uint64_t)value;
-        old_value_f = (double)old_value_i;
+        old_value_f = (double)(int64_t)old_value_i;
         break;
       }
       case SDNA_TYPE_UINT64: {
@@ -813,7 +816,7 @@ static void cast_primitive_type(const eSDNA_Type old_type,
       case SDNA_TYPE_INT8: {
         const int8_t value = *((int8_t *)old_data);
         old_value_i = (uint64_t)value;
-        old_value_f = (double)old_value_i;
+        old_value_f = (double)(int64_t)old_value_i;
       }
     }



More information about the Bf-blender-cvs mailing list