[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27781] trunk/blender/source/blender/ editors/object/object_add.c: Check result of object_add_duplicate_internal( ) before using it.

Sergey Sharybin g.ulairi at gmail.com
Sat Mar 27 11:43:05 CET 2010


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;
 }
 





More information about the Bf-blender-cvs mailing list