Revision: 27781 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27781 Author: nazgul Date: 2010-03-27 11:43:04 +0100 (Sat, 27 Mar 2010)
Log Message: ----------- Check result of object_add_duplicate_internal() before using it. This prevents segmentation fault when object in pose mode is duplicating. Modified Paths: -------------- trunk/blender/source/blender/editors/object/object_add.c Modified: trunk/blender/source/blender/editors/object/object_add.c =================================================================== --- trunk/blender/source/blender/editors/object/object_add.c 2010-03-26 20:18:39 UTC (rev 27780) +++ trunk/blender/source/blender/editors/object/object_add.c 2010-03-27 10:43:04 UTC (rev 27781) @@ -1709,13 +1709,17 @@ clear_id_newpoins(); clear_sca_new_poins(); /* sensor/contr/act */ - + basen= object_add_duplicate_internal(scene, base, dupflag); + if (basen == NULL) { + return NULL; + } + ob= basen->object; - + DAG_scene_sort(scene); ED_render_id_flush_update(G.main, ob->data); - + return basen; } @@ -1736,6 +1740,10 @@ the list is made in advance */ ED_base_object_select(base, BA_DESELECT); + if (basen == NULL) { + continue; + } + /* new object becomes active */ if(BASACT==base) ED_base_object_activate(C, basen); @@ -1798,36 +1806,42 @@ int linked= RNA_boolean_get(op->ptr, "linked"); int dupflag= (linked)? 0: U.dupflag; char name[32]; - + /* find object, create fake base */ RNA_string_get(op->ptr, "name", name); ob= (Object *)find_id("OB", name); if(ob==NULL) return OPERATOR_CANCELLED; - + base= MEM_callocN(sizeof(Base), "duplibase"); base->object= ob; base->flag= ob->flag; - + /* prepare dupli */ clear_id_newpoins(); clear_sca_new_poins(); /* sensor/contr/act */ - + basen= object_add_duplicate_internal(scene, base, dupflag); + + if (basen == NULL) { + MEM_freeN(base); + return OPERATOR_CANCELLED; + } + basen->lay= basen->object->lay= scene->lay; - + ED_object_location_from_view(C, basen->object->loc); ED_base_object_activate(C, basen); - + copy_object_set_idnew(C, dupflag); - + DAG_scene_sort(scene); DAG_ids_flush_update(0); - + MEM_freeN(base); - + WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, scene); - + return OPERATOR_FINISHED; } _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs