Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2019-02-15 10:09:02 +0300
committerCampbell Barton <ideasman42@gmail.com>2019-02-15 10:17:58 +0300
commitd17a0270344101c4cd6e5026ea8239240868d24f (patch)
tree0adc17cec74a69a8587f16252b32ff0dac6209c9 /source
parent925b20264162d075fcb0c979a9c9c515301bf4d1 (diff)
Fix DNA struct member versioning logic
Possible error changing names which are shared between structs. While the problem doesn't occur at the moment, avoid future problems.
Diffstat (limited to 'source')
-rw-r--r--source/blender/makesdna/DNA_sdna_types.h2
-rw-r--r--source/blender/makesdna/intern/dna_genfile.c9
2 files changed, 9 insertions, 2 deletions
diff --git a/source/blender/makesdna/DNA_sdna_types.h b/source/blender/makesdna/DNA_sdna_types.h
index 3ca2ce2fca4..36075d62002 100644
--- a/source/blender/makesdna/DNA_sdna_types.h
+++ b/source/blender/makesdna/DNA_sdna_types.h
@@ -34,7 +34,7 @@ typedef struct SDNA {
bool data_alloc;
/** Total number of struct members. */
- int nr_names;
+ int nr_names, nr_names_alloc;
/** Struct member names. */
const char **names;
diff --git a/source/blender/makesdna/intern/dna_genfile.c b/source/blender/makesdna/intern/dna_genfile.c
index d168458fc9a..6fb9408c197 100644
--- a/source/blender/makesdna/intern/dna_genfile.c
+++ b/source/blender/makesdna/intern/dna_genfile.c
@@ -328,6 +328,7 @@ static bool init_structDNA(
if (do_endian_swap) {
BLI_endian_switch_int32(&sdna->nr_names);
}
+ sdna->nr_names_alloc = sdna->nr_names;
data++;
sdna->names = MEM_callocN(sizeof(void *) * sdna->nr_names, "sdnanames");
@@ -1400,7 +1401,7 @@ static bool DNA_sdna_patch_struct_member_nr(
const int elem_old_len = strlen(elem_old);
const int elem_new_len = strlen(elem_new);
BLI_assert(elem_new != NULL);
- const short *sp = sdna->structs[struct_name_nr];
+ short *sp = sdna->structs[struct_name_nr];
for (int elem_index = sp[1]; elem_index > 0; elem_index--, sp += 2) {
const char *elem_old_full = sdna->names[sp[1]];
/* Start & end offsets in 'elem_old_full'. */
@@ -1416,7 +1417,13 @@ static bool DNA_sdna_patch_struct_member_nr(
elem_old_full, strlen(elem_old_full),
elem_old_full_offset_start);
+ if (sdna->nr_names == sdna->nr_names_alloc) {
+ sdna->nr_names_alloc += 64;
+ sdna->names = MEM_recallocN(sdna->names, sizeof(*sdna->names) * sdna->nr_names_alloc);
+ }
+ sp[1] = sdna->nr_names++;
sdna->names[sp[1]] = elem_new_full;
+
return true;
}
}