[Bf-blender-cvs] [9d674d9852d] master: Fix dna_genfile error converting signed int types to floating point
Campbell Barton
noreply at git.blender.org
Tue Feb 8 01:55:09 CET 2022
Commit: 9d674d9852db07ade16b521d1c0864b494d232e5
Author: Campbell Barton
Date: Tue Feb 8 11:50:15 2022 +1100
Branches: master
https://developer.blender.org/rB9d674d9852db07ade16b521d1c0864b494d232e5
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 7e9fabcc998..9a71e516389 100644
--- a/source/blender/makesdna/intern/dna_genfile.c
+++ b/source/blender/makesdna/intern/dna_genfile.c
@@ -733,6 +733,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++) {
@@ -752,7 +755,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: {
@@ -764,7 +767,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: {
@@ -782,7 +785,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: {
@@ -794,7 +797,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