[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