diff options
author | Campbell Barton <ideasman42@gmail.com> | 2019-02-15 10:09:02 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-02-15 10:17:58 +0300 |
commit | d17a0270344101c4cd6e5026ea8239240868d24f (patch) | |
tree | 0adc17cec74a69a8587f16252b32ff0dac6209c9 /source/blender | |
parent | 925b20264162d075fcb0c979a9c9c515301bf4d1 (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/blender')
-rw-r--r-- | source/blender/makesdna/DNA_sdna_types.h | 2 | ||||
-rw-r--r-- | source/blender/makesdna/intern/dna_genfile.c | 9 |
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; } } |