Fix bug [#30863] Array Modifier Start and End Cap cause crash when the Cap Object...
authorNicholas Bishop <nicholasbishop@gmail.com>
Mon, 9 Apr 2012 02:14:55 +0000 (02:14 +0000)
committerNicholas Bishop <nicholasbishop@gmail.com>
Mon, 9 Apr 2012 02:14:55 +0000 (02:14 +0000)
Another crash with array caps, was caused by not making a deep enough
copy of CD field.

Also fixed the type of the 'mask' parameter, was int where it should
be 64-bit.

source/blender/blenkernel/BKE_customdata.h
source/blender/blenkernel/intern/customdata.c

index 9797aa1201f29a13c8ebedaccfaa840922991a39..6a3625e213397aa4bacf315ce836c56c10960ea1 100644 (file)
@@ -111,7 +111,7 @@ void CustomData_merge(const struct CustomData *source, struct CustomData *dest,
  * then goes through the mesh and makes sure all the customdata blocks are
  * consistent with the new layout.*/
 void CustomData_bmesh_merge(struct CustomData *source, struct CustomData *dest, 
-                            int mask, int alloctype, struct BMesh *bm, const char htype);
+                            CustomDataMask mask, int alloctype, struct BMesh *bm, const char htype);
 
 /* frees data associated with a CustomData object (doesn't free the object
  * itself, though)
index c1d0a1674da9883e05a4555777c952f583ab53bc..9a879c80b15832fe32c803f4b3cbd6ae5b7d752e 100644 (file)
@@ -2156,13 +2156,18 @@ void CustomData_bmesh_init_pool(CustomData *data, int totelem, const char htype)
 }
 
 void CustomData_bmesh_merge(CustomData *source, CustomData *dest, 
-                            int mask, int alloctype, BMesh *bm, const char htype)
+                            CustomDataMask mask, int alloctype, BMesh *bm, const char htype)
 {
        BMHeader *h;
        BMIter iter;
-       CustomData destold = *dest;
+       CustomData destold;
        void *tmp;
        int t;
+
+       /* copy old layer description so that old data can be copied into
+          the new allocation */
+       destold = *dest;
+       if (destold.layers) destold.layers = MEM_dupallocN(destold.layers);
        
        CustomData_merge(source, dest, mask, alloctype, 0);
        dest->pool = NULL;
@@ -2208,6 +2213,7 @@ void CustomData_bmesh_merge(CustomData *source, CustomData *dest,
        }
 
        if (destold.pool) BLI_mempool_destroy(destold.pool);
+       if (destold.layers) MEM_freeN(destold.layers);
 }
 
 void CustomData_bmesh_free_block(CustomData *data, void **block)