[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13714] trunk/blender: fix for [#8257] double-freeing pointers from sculpt code
Campbell Barton
ideasman42 at gmail.com
Sat Feb 16 17:36:05 CET 2008
Revision: 13714
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13714
Author: campbellbarton
Date: 2008-02-16 17:35:47 +0100 (Sat, 16 Feb 2008)
Log Message:
-----------
fix for [#8257] double-freeing pointers from sculpt code
http://projects.blender.org/tracker/index.php?func=detail&aid=8257&group_id=9&atid=125
Cleaned up scene_copy, and moved some scene copying into this function that was inline in the user interface.
Also moved malloc error prints onto separate lines so you can set breakpoints.
Modified Paths:
--------------
trunk/blender/intern/guardedalloc/intern/mallocn.c
trunk/blender/source/blender/blenkernel/intern/scene.c
trunk/blender/source/blender/python/api2_2x/Scene.c
trunk/blender/source/blender/src/header_info.c
Modified: trunk/blender/intern/guardedalloc/intern/mallocn.c
===================================================================
--- trunk/blender/intern/guardedalloc/intern/mallocn.c 2008-02-16 04:12:54 UTC (rev 13713)
+++ trunk/blender/intern/guardedalloc/intern/mallocn.c 2008-02-16 16:35:47 UTC (rev 13714)
@@ -529,8 +529,10 @@
} else{
error = -1;
name = check_memlist(memh);
- if (name == 0) MemorY_ErroR("free","pointer not in memlist");
- else MemorY_ErroR(name,"error in header");
+ if (name == 0)
+ MemorY_ErroR("free","pointer not in memlist");
+ else
+ MemorY_ErroR(name,"error in header");
}
totblock--;
Modified: trunk/blender/source/blender/blenkernel/intern/scene.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/scene.c 2008-02-16 04:12:54 UTC (rev 13713)
+++ trunk/blender/source/blender/blenkernel/intern/scene.c 2008-02-16 16:35:47 UTC (rev 13714)
@@ -596,8 +596,10 @@
sd= &sce->sculptdata;
- if(sd->cumap)
+ if(sd->cumap) {
curvemapping_free(sd->cumap);
+ sd->cumap = NULL;
+ }
memset(sd, 0, sizeof(SculptData));
Modified: trunk/blender/source/blender/python/api2_2x/Scene.c
===================================================================
--- trunk/blender/source/blender/python/api2_2x/Scene.c 2008-02-16 04:12:54 UTC (rev 13713)
+++ trunk/blender/source/blender/python/api2_2x/Scene.c 2008-02-16 16:35:47 UTC (rev 13714)
@@ -774,16 +774,16 @@
/*-----------------------Scene.copy()------------------------------------*/
static PyObject *Scene_copy( BPy_Scene * self, PyObject * args )
{
- short dup_objs = 1;
+ short dup_objs = 2;
Scene *scene = self->scene;
SCENE_DEL_CHECK_PY(self);
- if( !PyArg_ParseTuple( args, "|h", &dup_objs ) )
+ if( !PyArg_ParseTuple( args, "|h", &dup_objs ) || dup_objs < 0 || dup_objs > 2)
return EXPP_ReturnPyObjError( PyExc_TypeError,
"expected int in [0,2] or nothing as argument" );
-
- return Scene_CreatePyObject( copy_scene( scene, dup_objs ) );
+
+ return Scene_CreatePyObject( copy_scene( scene, dup_objs+1 ) );
}
/*-----------------------Scene.makeCurrent()-----------------------------*/
Modified: trunk/blender/source/blender/src/header_info.c
===================================================================
--- trunk/blender/source/blender/src/header_info.c 2008-02-16 04:12:54 UTC (rev 13713)
+++ trunk/blender/source/blender/src/header_info.c 2008-02-16 16:35:47 UTC (rev 13714)
@@ -283,46 +283,82 @@
Scene *copy_scene(Scene *sce, int level)
{
- /* level 0: al objects shared
- * level 1: al object-data shared
- * level 2: full copy
+ /*
+ * level 0: empty, only copy minimal stuff
+ * level 1: all objects shared
+ * level 2: all object-data shared
+ * level 3: full copy
*/
+
Scene *scen;
Base *base, *obase;
-
- /* level 0 */
- scen= copy_libblock(sce);
- duplicatelist(&(scen->base), &(sce->base));
- clear_id_newpoins();
+ if (level==0) { /* Add Empty, minimal copy */
+ ListBase lb;
+ scen= add_scene(sce->id.name+2);
+
+ lb= scen->r.layers;
+ scen->r= sce->r;
+ scen->r.layers= lb;
+
+ } else {
+ /* level 1+, but not level 0 */
+ scen= copy_libblock(sce);
+ duplicatelist(&(scen->base), &(sce->base));
+
+ clear_id_newpoins();
+
+ id_us_plus((ID *)scen->world);
+ id_us_plus((ID *)scen->set);
- id_us_plus((ID *)scen->world);
- id_us_plus((ID *)scen->set);
-
- scen->ed= NULL;
- scen->radio= NULL;
- scen->theDag= NULL;
- scen->toolsettings= MEM_dupallocN(sce->toolsettings);
-
- duplicatelist(&(scen->markers), &(sce->markers));
- duplicatelist(&(scen->transform_spaces), &(sce->transform_spaces));
- duplicatelist(&(scen->r.layers), &(sce->r.layers));
+ scen->ed= NULL;
+ scen->radio= NULL;
+ scen->theDag= NULL;
+ scen->toolsettings= MEM_dupallocN(sce->toolsettings);
- scen->nodetree= ntreeCopyTree(sce->nodetree, 0);
+ duplicatelist(&(scen->markers), &(sce->markers));
+ duplicatelist(&(scen->transform_spaces), &(sce->transform_spaces));
+ duplicatelist(&(scen->r.layers), &(sce->r.layers));
+
+ scen->nodetree= ntreeCopyTree(sce->nodetree, 0);
+
+ obase= sce->base.first;
+ base= scen->base.first;
+ while(base) {
+ id_us_plus(&base->object->id);
+ if(obase==sce->basact) scen->basact= base;
- obase= sce->base.first;
- base= scen->base.first;
- while(base) {
- id_us_plus(&base->object->id);
- if(obase==sce->basact) scen->basact= base;
-
- obase= obase->next;
- base= base->next;
+ obase= obase->next;
+ base= base->next;
+ }
+ BPY_copy_scriptlink(&sce->scriptlink);
+
+ /* sculpt data */
+ if (sce->sculptdata.cumap) {
+ scen->sculptdata.cumap = curvemapping_copy( sce->sculptdata.cumap );
+ }
}
+
+ // make a private copy of the avicodecdata
+
+ if (sce->r.avicodecdata) {
+
+ scen->r.avicodecdata = MEM_dupallocN(sce->r.avicodecdata);
+ scen->r.avicodecdata->lpFormat = MEM_dupallocN(scen->r.avicodecdata->lpFormat);
+ scen->r.avicodecdata->lpParms = MEM_dupallocN(scen->r.avicodecdata->lpParms);
+ }
+
+ // make a private copy of the qtcodecdata
+
+ if (sce->r.qtcodecdata) {
+ scen->r.qtcodecdata = MEM_dupallocN(sce->r.qtcodecdata);
+ scen->r.qtcodecdata->cdParms = MEM_dupallocN(scen->r.qtcodecdata->cdParms);
+ }
+
+
+ if(level==0 || level==1) return scen;
- if(level==0) return scen;
-
- /* level 1 */
+ /* level 2 */
G.scene= scen;
single_object_users(0);
@@ -330,8 +366,8 @@
/* camera */
ID_NEW(G.scene->camera);
- /* level 2 */
- if(level>=2) {
+ /* level 3 */
+ if(level>=3) {
if(scen->world) {
id_us_plus(&scen->world->id);
scen->world= copy_world(scen->world);
@@ -345,24 +381,6 @@
}
clear_id_newpoins();
-
- BPY_copy_scriptlink(&sce->scriptlink);
- // make a private copy of the avicodecdata
-
- if (sce->r.avicodecdata) {
-
- scen->r.avicodecdata = MEM_dupallocN(sce->r.avicodecdata);
- scen->r.avicodecdata->lpFormat = MEM_dupallocN(scen->r.avicodecdata->lpFormat);
- scen->r.avicodecdata->lpParms = MEM_dupallocN(scen->r.avicodecdata->lpParms);
- }
-
- // make a private copy of the qtcodecdata
-
- if (sce->r.qtcodecdata) {
- scen->r.qtcodecdata = MEM_dupallocN(sce->r.qtcodecdata);
- scen->r.qtcodecdata->cdParms = MEM_dupallocN(scen->r.qtcodecdata->cdParms);
- }
-
return scen;
}
@@ -448,32 +466,9 @@
}
/* last item: NEW SCENE */
if(sce==0) {
- nr= pupmenu("Add scene%t|Empty|Link Objects|Link ObData|Full Copy");
- if(nr<= 0) return;
- if(nr==1) {
- ListBase lb;
-
- sce= add_scene(G.scene->id.name+2);
- /* pretty bad ass copying here. we should use copy_scene to do all (ton) */
- lb= sce->r.layers;
- sce->r= G.scene->r;
- sce->r.layers= lb;
-#ifdef _WIN32
- if (sce->r.avicodecdata) {
- sce->r.avicodecdata = MEM_dupallocN(G.scene->r.avicodecdata);
- sce->r.avicodecdata->lpFormat = MEM_dupallocN(G.scene->r.avicodecdata->lpFormat);
- sce->r.avicodecdata->lpParms = MEM_dupallocN(G.scene->r.avicodecdata->lpParms);
- }
-#endif
-#ifdef WITH_QUICKTIME
- if (sce->r.qtcodecdata) {
- sce->r.qtcodecdata = MEM_dupallocN(G.scene->r.qtcodecdata);
- sce->r.qtcodecdata->cdParms = MEM_dupallocN(G.scene->r.qtcodecdata->cdParms);
- }
-#endif
- }
- else sce= copy_scene(G.scene, nr-2);
-
+ nr= pupmenu("Add scene%t|Empty%x0|Link Objects%x1|Link ObData%x2|Full Copy%x3");
+ if(nr<0) return;
+ sce= copy_scene(G.scene, nr);
set_scene(sce);
}
countall();
More information about the Bf-blender-cvs
mailing list