From 1c7e34715b99485e408a95d76e21ec84d546d075 Mon Sep 17 00:00:00 2001 From: vrld Date: Tue, 25 Jan 2011 13:24:39 +0100 Subject: [PATCH] Add NULL initializers for pointers. Constructing invalid shapes, e.g. a rectangle with width 0, could result in a b2Assert to fail. In turn, Shape::~Shape tried to destroy a the shape with an uninitialized pointer, yielding a segfault. Add NULL-initializers and checks for NULL to prevent this. --- src/modules/physics/box2d/CircleShape.cpp | 3 ++- src/modules/physics/box2d/DistanceJoint.cpp | 2 +- src/modules/physics/box2d/GearJoint.cpp | 2 +- src/modules/physics/box2d/Joint.cpp | 3 ++- src/modules/physics/box2d/MouseJoint.cpp | 2 +- src/modules/physics/box2d/PolygonShape.cpp | 2 +- src/modules/physics/box2d/PrismaticJoint.cpp | 2 +- src/modules/physics/box2d/PulleyJoint.cpp | 2 +- src/modules/physics/box2d/RevoluteJoint.cpp | 2 +- src/modules/physics/box2d/Shape.cpp | 5 +++-- src/modules/physics/box2d/World.cpp | 4 ++-- 11 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/modules/physics/box2d/CircleShape.cpp b/src/modules/physics/box2d/CircleShape.cpp index ab1242dd3..2c1546756 100644 --- a/src/modules/physics/box2d/CircleShape.cpp +++ b/src/modules/physics/box2d/CircleShape.cpp @@ -37,8 +37,9 @@ namespace box2d def->radius = body->world->scaleDown(def->radius); radius = def->radius; this->localPosition = def->localPosition; + + def->userData = (void*)data; shape = body->body->CreateShape(def); - shape->SetUserData((void*)data); } CircleShape::~CircleShape() diff --git a/src/modules/physics/box2d/DistanceJoint.cpp b/src/modules/physics/box2d/DistanceJoint.cpp index e7bcf6db2..3089139e4 100644 --- a/src/modules/physics/box2d/DistanceJoint.cpp +++ b/src/modules/physics/box2d/DistanceJoint.cpp @@ -31,7 +31,7 @@ namespace physics namespace box2d { DistanceJoint::DistanceJoint(Body * body1, Body * body2, float x1, float y1, float x2, float y2) - : Joint(body1, body2) + : Joint(body1, body2), joint(NULL) { b2DistanceJointDef def; def.Initialize(body1->body, body2->body, world->scaleDown(b2Vec2(x1,y1)), world->scaleDown(b2Vec2(x2,y2))); diff --git a/src/modules/physics/box2d/GearJoint.cpp b/src/modules/physics/box2d/GearJoint.cpp index 6366869e5..6dba58348 100644 --- a/src/modules/physics/box2d/GearJoint.cpp +++ b/src/modules/physics/box2d/GearJoint.cpp @@ -31,7 +31,7 @@ namespace physics namespace box2d { GearJoint::GearJoint(Joint * joint1, Joint * joint2, float ratio) - : Joint(joint1->body2, joint2->body2) + : Joint(joint1->body2, joint2->body2), joint(NULL) { b2GearJointDef def; def.joint1 = joint1->joint; diff --git a/src/modules/physics/box2d/Joint.cpp b/src/modules/physics/box2d/Joint.cpp index ca15c0cb2..4e7f0368e 100644 --- a/src/modules/physics/box2d/Joint.cpp +++ b/src/modules/physics/box2d/Joint.cpp @@ -117,7 +117,8 @@ namespace box2d void Joint::destroyJoint(b2Joint * joint) { - world->world->DestroyJoint(joint); + if (joint != NULL) + world->world->DestroyJoint(joint); } } // box2d diff --git a/src/modules/physics/box2d/MouseJoint.cpp b/src/modules/physics/box2d/MouseJoint.cpp index caaf7d0af..e35f37445 100644 --- a/src/modules/physics/box2d/MouseJoint.cpp +++ b/src/modules/physics/box2d/MouseJoint.cpp @@ -31,7 +31,7 @@ namespace physics namespace box2d { MouseJoint::MouseJoint(Body * body1, float x, float y) - : Joint(body1) + : Joint(body1), joint(NULL) { b2MouseJointDef def; diff --git a/src/modules/physics/box2d/PolygonShape.cpp b/src/modules/physics/box2d/PolygonShape.cpp index 705ebfe87..367438037 100644 --- a/src/modules/physics/box2d/PolygonShape.cpp +++ b/src/modules/physics/box2d/PolygonShape.cpp @@ -36,8 +36,8 @@ namespace box2d for(int i = 0; ivertexCount; i++) def->vertices[i] = body->world->scaleDown(def->vertices[i]); + def->userData = (void*)data; shape = body->body->CreateShape(def); - shape->SetUserData((void*)data); } PolygonShape::~PolygonShape() diff --git a/src/modules/physics/box2d/PrismaticJoint.cpp b/src/modules/physics/box2d/PrismaticJoint.cpp index 0a3fa18f7..b613cbe6f 100644 --- a/src/modules/physics/box2d/PrismaticJoint.cpp +++ b/src/modules/physics/box2d/PrismaticJoint.cpp @@ -31,7 +31,7 @@ namespace physics namespace box2d { PrismaticJoint::PrismaticJoint(Body * body1, Body * body2, float x, float y, float ax, float ay) - : Joint(body1, body2) + : Joint(body1, body2), joint(NULL) { b2PrismaticJointDef def; diff --git a/src/modules/physics/box2d/PulleyJoint.cpp b/src/modules/physics/box2d/PulleyJoint.cpp index bc179a72a..e4193902b 100644 --- a/src/modules/physics/box2d/PulleyJoint.cpp +++ b/src/modules/physics/box2d/PulleyJoint.cpp @@ -31,7 +31,7 @@ namespace physics namespace box2d { PulleyJoint::PulleyJoint(Body * body1, Body * body2, b2Vec2 groundAnchor1, b2Vec2 groundAnchor2, b2Vec2 anchor1, b2Vec2 anchor2, float ratio) - : Joint(body1, body2) + : Joint(body1, body2), joint(NULL) { b2PulleyJointDef def; def.Initialize(body1->body, body2->body, world->scaleDown(groundAnchor1), world->scaleDown(groundAnchor2), \ diff --git a/src/modules/physics/box2d/RevoluteJoint.cpp b/src/modules/physics/box2d/RevoluteJoint.cpp index 95fe098da..a3003f900 100644 --- a/src/modules/physics/box2d/RevoluteJoint.cpp +++ b/src/modules/physics/box2d/RevoluteJoint.cpp @@ -33,7 +33,7 @@ namespace physics namespace box2d { RevoluteJoint::RevoluteJoint(Body * body1, Body * body2, float x, float y) - : Joint(body1, body2) + : Joint(body1, body2), joint(NULL) { b2RevoluteJointDef def; def.Initialize(body1->body, body2->body, world->scaleDown(b2Vec2(x,y))); diff --git a/src/modules/physics/box2d/Shape.cpp b/src/modules/physics/box2d/Shape.cpp index 8b174b6b1..32dcb3304 100644 --- a/src/modules/physics/box2d/Shape.cpp +++ b/src/modules/physics/box2d/Shape.cpp @@ -34,7 +34,7 @@ namespace physics namespace box2d { Shape::Shape(Body * body) - : body(body) + : body(body), shape(NULL) { body->retain(); data = new shapeudata(); @@ -49,7 +49,8 @@ namespace box2d delete data; data = 0; - body->body->DestroyShape(shape); + if (shape) + body->body->DestroyShape(shape); shape = 0; body->release(); diff --git a/src/modules/physics/box2d/World.cpp b/src/modules/physics/box2d/World.cpp index 006731b03..cc338b11c 100644 --- a/src/modules/physics/box2d/World.cpp +++ b/src/modules/physics/box2d/World.cpp @@ -96,14 +96,14 @@ namespace box2d } World::World(b2AABB aabb) - : meter(DEFAULT_METER) + : meter(DEFAULT_METER), world(NULL) { world = new b2World(scaleDown(aabb), b2Vec2(0,0), true); world->SetContactListener(this); } World::World(b2AABB aabb, b2Vec2 gravity, bool sleep, int meter) - : meter(meter) + : meter(meter), world(NULL) { world = new b2World(scaleDown(aabb), scaleDown(gravity), sleep); world->SetContactListener(this);