Commit: 958e6b1f20436b7f6b9f3cef3928feef170789ec Author: Lukas Tönne Date: Sun May 3 12:44:49 2015 +0200 Branches: alembic https://developer.blender.org/rB958e6b1f20436b7f6b9f3cef3928feef170789ec
Some NULL pointer checks in shape key code to ensure the Key struct can be used without a 'from' pointer. =================================================================== M source/blender/blenkernel/intern/key.c M source/blender/editors/object/object_shapekey.c M source/blender/makesrna/intern/rna_key.c =================================================================== diff --git a/source/blender/blenkernel/intern/key.c b/source/blender/blenkernel/intern/key.c index 3aea343..3d8950b 100644 --- a/source/blender/blenkernel/intern/key.c +++ b/source/blender/blenkernel/intern/key.c @@ -109,38 +109,40 @@ Key *BKE_key_add(ID *id) /* common function */ key->uidgen = 1; - /* XXX the code here uses some defines which will soon be deprecated... */ - switch (GS(id->name)) { - case ID_ME: - el = key->elemstr; - - el[0] = 3; - el[1] = IPO_FLOAT; - el[2] = 0; - - key->elemsize = 12; - - break; - case ID_LT: - el = key->elemstr; - - el[0] = 3; - el[1] = IPO_FLOAT; - el[2] = 0; - - key->elemsize = 12; - - break; - case ID_CU: - el = key->elemstr; - - el[0] = 4; - el[1] = IPO_BPOINT; - el[2] = 0; - - key->elemsize = 16; - - break; + if (id) { + /* XXX the code here uses some defines which will soon be deprecated... */ + switch (GS(id->name)) { + case ID_ME: + el = key->elemstr; + + el[0] = 3; + el[1] = IPO_FLOAT; + el[2] = 0; + + key->elemsize = 12; + + break; + case ID_LT: + el = key->elemstr; + + el[0] = 3; + el[1] = IPO_FLOAT; + el[2] = 0; + + key->elemsize = 12; + + break; + case ID_CU: + el = key->elemstr; + + el[0] = 4; + el[1] = IPO_BPOINT; + el[2] = 0; + + key->elemsize = 16; + + break; + } } return key; @@ -514,7 +516,7 @@ static char *key_block_get_data(Key *key, KeyBlock *actkb, KeyBlock *kb, char ** if (kb == actkb) { /* this hack makes it possible to edit shape keys in * edit mode with shape keys blending applied */ - if (GS(key->from->name) == ID_ME) { + if (key->from && GS(key->from->name) == ID_ME) { Mesh *me; BMVert *eve; BMIter iter; diff --git a/source/blender/editors/object/object_shapekey.c b/source/blender/editors/object/object_shapekey.c index 674eb25..9a8c8b3 100644 --- a/source/blender/editors/object/object_shapekey.c +++ b/source/blender/editors/object/object_shapekey.c @@ -97,10 +97,12 @@ static bool ED_object_shape_key_remove_all(Main *bmain, Object *ob) if (key == NULL) return false; - switch (GS(key->from->name)) { - case ID_ME: ((Mesh *)key->from)->key = NULL; break; - case ID_CU: ((Curve *)key->from)->key = NULL; break; - case ID_LT: ((Lattice *)key->from)->key = NULL; break; + if (key->from) { + switch (GS(key->from->name)) { + case ID_ME: ((Mesh *)key->from)->key = NULL; break; + case ID_CU: ((Curve *)key->from)->key = NULL; break; + case ID_LT: ((Lattice *)key->from)->key = NULL; break; + } } BKE_libblock_free_us(bmain, key); @@ -162,10 +164,12 @@ static bool ED_object_shape_key_remove(Main *bmain, Object *ob) } if (key->totkey == 0) { - switch (GS(key->from->name)) { - case ID_ME: ((Mesh *)key->from)->key = NULL; break; - case ID_CU: ((Curve *)key->from)->key = NULL; break; - case ID_LT: ((Lattice *)key->from)->key = NULL; break; + if (key->from) { + switch (GS(key->from->name)) { + case ID_ME: ((Mesh *)key->from)->key = NULL; break; + case ID_CU: ((Curve *)key->from)->key = NULL; break; + case ID_LT: ((Lattice *)key->from)->key = NULL; break; + } } BKE_libblock_free_us(bmain, key); diff --git a/source/blender/makesrna/intern/rna_key.c b/source/blender/makesrna/intern/rna_key.c index 249d132..d34af9f 100644 --- a/source/blender/makesrna/intern/rna_key.c +++ b/source/blender/makesrna/intern/rna_key.c @@ -303,7 +303,7 @@ static void rna_ShapeKey_data_begin(CollectionPropertyIterator *iter, PointerRNA Nurb *nu; int tot = kb->totelem, size = key->elemsize; - if (GS(key->from->name) == ID_CU) { + if (key->from && GS(key->from->name) == ID_CU) { cu = (Curve *)key->from; nu = cu->nurb.first; @@ -324,7 +324,7 @@ static int rna_ShapeKey_data_length(PointerRNA *ptr) Nurb *nu; int tot = kb->totelem; - if (GS(key->from->name) == ID_CU) { + if (key->from && GS(key->from->name) == ID_CU) { cu = (Curve *)key->from; nu = cu->nurb.first; @@ -342,7 +342,7 @@ static PointerRNA rna_ShapeKey_data_get(CollectionPropertyIterator *iter) Curve *cu; Nurb *nu; - if (GS(key->from->name) == ID_CU) { + if (key->from && GS(key->from->name) == ID_CU) { cu = (Curve *)key->from; nu = cu->nurb.first; _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs