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

Reply via email to