]> git.mxchange.org Git - simgear.git/commitdiff
#717: Disabling advanced weather crashes the sim
authorThorstenB <brehmt@gmail.com>
Wed, 25 Apr 2012 19:08:37 +0000 (21:08 +0200)
committerThorstenB <brehmt@gmail.com>
Wed, 25 Apr 2012 19:08:37 +0000 (21:08 +0200)
Protect from a NULL-pointer segfault in SGCloudField::removeCloudFromTree
when disabling advanced weather (may just fix a symptom).

simgear/scene/sky/cloudfield.cxx

index f3abdc12966aa87bd16629cb638f1201822ee162..1d9ae9ea98016f97d3af2887fcb923e7234a390a 100644 (file)
@@ -178,7 +178,7 @@ SGCloudField::SGCloudField() :
 }
     
 SGCloudField::~SGCloudField() {
-        }
+}
 
 
 void SGCloudField::clear(void) {
@@ -208,7 +208,7 @@ void SGCloudField::applyVisAndLoDRange(void)
             
 bool SGCloudField::addCloud(float lon, float lat, float alt, int index, osg::ref_ptr<EffectGeode> geode) {
   return addCloud(lon, lat, alt, 0.0f, 0.0f, index, geode);
-        }
+}
 
 bool SGCloudField::addCloud(float lon, float lat, float alt, float x, float y, int index, osg::ref_ptr<EffectGeode> geode) {
     // If this cloud index already exists, don't replace it.
@@ -220,11 +220,16 @@ bool SGCloudField::addCloud(float lon, float lat, float alt, float x, float y, i
     addCloudToTree(transform, lon, lat, alt, x, y);
     cloud_hash[index] = transform;
     return true;
-    }
-    
+}
+
 // Remove a give cloud from inside the tree, without removing it from the cloud hash
 void SGCloudField::removeCloudFromTree(osg::ref_ptr<osg::PositionAttitudeTransform> transform)
 {
+    if (transform == 0)
+    {
+        // Ooops!
+        return;
+    }
     osg::ref_ptr<osg::Group> lodnode = transform->getParent(0);
     lodnode->removeChild(transform);
     cloudcount--;
@@ -236,8 +241,8 @@ void SGCloudField::removeCloudFromTree(osg::ref_ptr<osg::PositionAttitudeTransfo
         lodnode1->removeChild(lodnode);
         lodcount--;
 
-        if (lodnode1->getNumChildren() == 0) {        
-          impostornode->removeChild(lodnode1);        
+        if (lodnode1->getNumChildren() == 0) {
+          impostornode->removeChild(lodnode1);
           placed_root->removeChild(impostornode);
           impostorcount--;
         }