[Bf-blender-cvs] [fe5f201] hair_system: Fix NULL access to the RigidBodyWorld.group pointer in various cases which were previously filtered out by strict non-caching requirement.

Lukas Tönne noreply at git.blender.org
Tue Aug 5 15:21:29 CEST 2014


Commit: fe5f201a0d48eeb69768cff0657589f6658b6422
Author: Lukas Tönne
Date:   Mon Aug 4 18:36:41 2014 +0200
Branches: hair_system
https://developer.blender.org/rBfe5f201a0d48eeb69768cff0657589f6658b6422

Fix NULL access to the RigidBodyWorld.group pointer in various cases
which were previously filtered out by strict non-caching requirement.

===================================================================

M	source/blender/blenkernel/intern/rigidbody.c
M	source/blender/blenkernel/intern/rigidbody_objects.c

===================================================================

diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index a373600..922e44f 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -710,16 +710,22 @@ static void rigidbody_update_ob_array(RigidBodyWorld *rbw)
 	GroupObject *go;
 	int i, n;
 
-	n = BLI_countlist(&rbw->group->gobject);
-
-	if (rbw->numbodies != n) {
-		rbw->numbodies = n;
-		rbw->objects = realloc(rbw->objects, sizeof(Object *) * rbw->numbodies);
+	if (rbw->group) {
+		n = BLI_countlist(&rbw->group->gobject);
+		
+		if (rbw->numbodies != n) {
+			rbw->numbodies = n;
+			rbw->objects = realloc(rbw->objects, sizeof(Object *) * rbw->numbodies);
+		}
+		
+		for (go = rbw->group->gobject.first, i = 0; go; go = go->next, i++) {
+			Object *ob = go->ob;
+			rbw->objects[i] = ob;
+		}
 	}
-
-	for (go = rbw->group->gobject.first, i = 0; go; go = go->next, i++) {
-		Object *ob = go->ob;
-		rbw->objects[i] = ob;
+	else {
+		rbw->numbodies = 0;
+		rbw->objects = NULL;
 	}
 }
 
@@ -748,7 +754,7 @@ static void rigidbody_sync_world(Scene *scene, RigidBodyWorld *rbw)
  *
  * \param rebuild Rebuild entire simulation
  */
-static void rigidbody_world_build(Scene *scene, RigidBodyWorld *rbw, int rebuild)
+static void rigidbody_world_build(Scene *scene, RigidBodyWorld *rbw, bool rebuild)
 {
 	/* update world */
 	if (rebuild)
@@ -829,7 +835,7 @@ void BKE_rigidbody_rebuild_world(Scene *scene, float ctime)
 	cache = rbw->pointcache;
 
 	/* flag cache as outdated if we don't have a world or number of objects in the simulation has changed */
-	if (rbw->physics_world == NULL || rbw->numbodies != BLI_countlist(&rbw->group->gobject)) {
+	if (rbw->physics_world == NULL || (rbw->group && rbw->numbodies != BLI_countlist(&rbw->group->gobject))) {
 		cache->flag |= PTCACHE_OUTDATED;
 	}
 
diff --git a/source/blender/blenkernel/intern/rigidbody_objects.c b/source/blender/blenkernel/intern/rigidbody_objects.c
index 67ac4a0..caaee2b 100644
--- a/source/blender/blenkernel/intern/rigidbody_objects.c
+++ b/source/blender/blenkernel/intern/rigidbody_objects.c
@@ -197,6 +197,8 @@ static void rigidbody_validate_sim_object(RigidBodyWorld *rbw, Object *ob, bool
 void BKE_rigidbody_objects_build(Scene *scene, struct RigidBodyWorld *rbw, bool rebuild)
 {
 	GroupObject *go;
+	if (!rbw->group)
+		return;
 	for (go = rbw->group->gobject.first; go; go = go->next) {
 		Object *ob = go->ob;
 		RigidBodyOb *rbo;
@@ -487,7 +489,8 @@ static void rigidbody_world_apply_object(Scene *UNUSED(scene), Object *ob)
 void BKE_rigidbody_objects_apply(Scene *scene, RigidBodyWorld *rbw)
 {
 	GroupObject *go;
-	
+	if (!rbw->group)
+		return;
 	for (go = rbw->group->gobject.first; go; go = go->next) {
 		Object *ob = go->ob;




More information about the Bf-blender-cvs mailing list