[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49877] trunk/blender/source/blender: fix for missing NULL checks when sequence-strip pointers become NULL because of problems with library linking .

Campbell Barton ideasman42 at gmail.com
Mon Aug 13 19:25:03 CEST 2012


Revision: 49877
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49877
Author:   campbellbarton
Date:     2012-08-13 17:25:03 +0000 (Mon, 13 Aug 2012)
Log Message:
-----------
fix for missing NULL checks when sequence-strip pointers become NULL because of problems with library linking.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/mask.c
    trunk/blender/source/blender/blenkernel/intern/sequencer.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/makesdna/DNA_sequence_types.h

Modified: trunk/blender/source/blender/blenkernel/intern/mask.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mask.c	2012-08-13 16:03:48 UTC (rev 49876)
+++ trunk/blender/source/blender/blenkernel/intern/mask.c	2012-08-13 17:25:03 UTC (rev 49877)
@@ -40,18 +40,22 @@
 #include "BLI_math.h"
 
 #include "DNA_mask_types.h"
+#include "DNA_node_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_object_types.h"
 #include "DNA_screen_types.h"
 #include "DNA_space_types.h"
 #include "DNA_movieclip_types.h"
 #include "DNA_tracking_types.h"
+#include "DNA_sequence_types.h"
 
 #include "BKE_curve.h"
 #include "BKE_global.h"
 #include "BKE_library.h"
 #include "BKE_main.h"
 #include "BKE_mask.h"
+#include "BKE_node.h"
+#include "BKE_sequencer.h"
 #include "BKE_tracking.h"
 #include "BKE_movieclip.h"
 #include "BKE_utildefines.h"
@@ -1561,26 +1565,83 @@
 	BKE_mask_layer_free_list(&mask->masklayers);
 }
 
+
+static void ntree_unlink_mask_cb(void *calldata, struct ID *UNUSED(owner_id), struct bNodeTree *ntree)
+{
+	ID *id = (ID *)calldata;
+	bNode *node;
+
+	for (node = ntree->nodes.first; node; node = node->next) {
+		if (node->id == id) {
+			node->id = NULL;
+		}
+	}
+}
+
 void BKE_mask_unlink(Main *bmain, Mask *mask)
 {
 	bScreen *scr;
 	ScrArea *area;
 	SpaceLink *sl;
+	Scene *scene;
 
 	for (scr = bmain->screen.first; scr; scr = scr->id.next) {
 		for (area = scr->areabase.first; area; area = area->next) {
 			for (sl = area->spacedata.first; sl; sl = sl->next) {
-				if (sl->spacetype == SPACE_CLIP) {
-					SpaceClip *sc = (SpaceClip *) sl;
+				switch (sl->spacetype) {
+					case SPACE_CLIP:
+					{
+						SpaceClip *sc = (SpaceClip *)sl;
 
-					if (sc->mask_info.mask == mask)
-						sc->mask_info.mask = NULL;
+						if (sc->mask_info.mask == mask) {
+							sc->mask_info.mask = NULL;
+						}
+						break;
+					}
+					case SPACE_IMAGE:
+					{
+						SpaceImage *sima = (SpaceImage *)sl;
+
+						if (sima->mask_info.mask == mask) {
+							sima->mask_info.mask = NULL;
+						}
+						break;
+					}
 				}
 			}
 		}
 	}
 
-	mask->id.us = 0;
+	for (scene = bmain->scene.first; scene; scene = scene->id.next) {
+		if (scene->ed) {
+			Sequence *seq;
+
+			SEQ_BEGIN (scene->ed, seq)
+			{
+				if (seq->mask == mask) {
+					seq->mask = NULL;
+				}
+			}
+			SEQ_END
+		}
+
+
+		if (scene->nodetree) {
+			bNode *node;
+			for (node = scene->nodetree->nodes.first; node; node = node->next) {
+				if (node->id == &mask->id) {
+					node->id = NULL;
+				}
+			}
+		}
+	}
+
+	{
+		bNodeTreeType *treetype = ntreeGetType(NTREE_COMPOSIT);
+		treetype->foreach_nodetree(bmain, (void *)mask, &ntree_unlink_mask_cb);
+	}
+
+	BKE_libblock_free(&bmain->mask, mask);
 }
 
 void BKE_mask_coord_from_frame(float r_co[2], const float co[2], const float frame_size[2])

Modified: trunk/blender/source/blender/blenkernel/intern/sequencer.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/sequencer.c	2012-08-13 16:03:48 UTC (rev 49876)
+++ trunk/blender/source/blender/blenkernel/intern/sequencer.c	2012-08-13 17:25:03 UTC (rev 49877)
@@ -594,6 +594,9 @@
 			}
 			break;
 		case SEQ_TYPE_MOVIECLIP:
+			if (seq->clip == NULL)
+				return;
+
 			seq->len = BKE_movieclip_get_duration(seq->clip);
 
 			seq->len -= seq->anim_startofs;
@@ -603,8 +606,9 @@
 			}
 			break;
 		case SEQ_TYPE_MASK:
+			if (seq->mask == NULL)
+				return;
 			seq->len = BKE_mask_get_duration(seq->mask);
-
 			seq->len -= seq->anim_startofs;
 			seq->len -= seq->anim_endofs;
 			if (seq->len < 0) {

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2012-08-13 16:03:48 UTC (rev 49876)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2012-08-13 17:25:03 UTC (rev 49877)
@@ -4842,19 +4842,27 @@
 				}
 				if (seq->clip) {
 					seq->clip = newlibadr(fd, sce->id.lib, seq->clip);
-					seq->clip->id.us++;
+					if (seq->clip) {
+						seq->clip->id.us++;
+					}
 				}
 				if (seq->mask) {
 					seq->mask = newlibadr(fd, sce->id.lib, seq->mask);
-					seq->mask->id.us++;
+					if (seq->mask) {
+						seq->mask->id.us++;
+					}
 				}
-				if (seq->scene_camera) seq->scene_camera = newlibadr(fd, sce->id.lib, seq->scene_camera);
+				if (seq->scene_camera) {
+					seq->scene_camera = newlibadr(fd, sce->id.lib, seq->scene_camera);
+				}
 				if (seq->sound) {
 					seq->scene_sound = NULL;
-					if (seq->type == SEQ_TYPE_SOUND_HD)
+					if (seq->type == SEQ_TYPE_SOUND_HD) {
 						seq->type = SEQ_TYPE_SOUND_RAM;
-					else
+					}
+					else {
 						seq->sound = newlibadr(fd, sce->id.lib, seq->sound);
+					}
 					if (seq->sound) {
 						seq->sound->id.us++;
 						seq->scene_sound = sound_add_scene_sound_defaults(sce, seq);

Modified: trunk/blender/source/blender/makesdna/DNA_sequence_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_sequence_types.h	2012-08-13 16:03:48 UTC (rev 49876)
+++ trunk/blender/source/blender/makesdna/DNA_sequence_types.h	2012-08-13 17:25:03 UTC (rev 49877)
@@ -102,8 +102,10 @@
 } Strip;
 
 /* The sequence structure is the basic struct used by any strip. each of the strips uses a different sequence structure.*/
-/* WATCH IT: first part identical to ID (for use in ipo's) */
+/* WATCH IT: first part identical to ID (for use in ipo's)
+ * the commend above is historic, probably we can drop the ID compatibility, but take care making this change */
 
+/* WATCH ITv2, this is really a 'Strip' in the UI!, name is highly confusing */
 typedef struct Sequence {
 	struct Sequence *next, *prev;
 	void *tmp; /* tmp var for copying, and tagging for linked selection */
@@ -127,12 +129,14 @@
 	Strip *strip;
 
 	struct Ipo *ipo DNA_DEPRECATED;   /* old animation system, deprecated for 2.5 */
-	struct Scene *scene;
-	struct Object *scene_camera; /* override scene camera */
 
+	/* these ID vars should never be NULL but can be when linked libs fail to load, so check on access */
+	struct Scene     *scene;
+	struct Object    *scene_camera;  /* override scene camera */
+	struct MovieClip *clip;          /* for MOVIECLIP strips */
+	struct Mask      *mask;          /* for MASK strips */
+
 	struct anim *anim;      /* for MOVIE strips */
-	struct MovieClip *clip; /* for MOVIECLIP strips */
-	struct Mask *mask;      /* for MASK strips */
 
 	float effect_fader;
 	float speed_fader;




More information about the Bf-blender-cvs mailing list