On Sat, Nov 03, 2012 at 02:54:01PM -0400, Michael Gilbert wrote:
> control: severity -1 serious
> 
> Marking this as serious since it is somewhat common for users to
> download untrusted models, which could contain this malicious data.

Patches from Tom Callaway are attached.

Cheers,
        Moritz
diff -up flightgear-2.6.0/src/Cockpit/panel.cxx.checkforn flightgear-2.6.0/src/Cockpit/panel.cxx
--- flightgear-2.6.0/src/Cockpit/panel.cxx.checkforn	2012-02-17 17:41:14.704313333 -0500
+++ flightgear-2.6.0/src/Cockpit/panel.cxx	2012-05-29 21:01:31.264831372 -0400
@@ -1209,8 +1209,18 @@ FGTextLayer::Chunk::Chunk (const string
   : _type(FGTextLayer::TEXT), _fmt(fmt)
 {
   _text = text;
-  if (_fmt.empty()) 
-    _fmt = "%s";
+  if (_fmt.empty()) {
+    _fmt = "%s"; 
+  } else {
+    // It is never safe for _fmt.c_str to be %n.    
+    string unsafe ("%n");
+    size_t found;
+    found=_fmt.find(unsafe);
+    if (found!=string::npos) {
+      SG_LOG(SG_COCKPIT, SG_WARN, "format type contained %n, but this is unsafe, reverting to %s");
+      _fmt = "%s";
+    }
+  }   
 }
 
 FGTextLayer::Chunk::Chunk (ChunkType type, const SGPropertyNode * node,
@@ -1223,6 +1233,20 @@ FGTextLayer::Chunk::Chunk (ChunkType typ
       _fmt = "%s";
     else
       _fmt = "%.2f";
+  } else {
+    // It is never safe for _fmt.c_str to be %n.
+    string unsafe ("%n");
+    size_t found;
+    found=_fmt.find(unsafe);
+    if (found!=string::npos) {
+      if (type == TEXT_VALUE) {
+        SG_LOG(SG_COCKPIT, SG_WARN, "format type contained %n, but this is unsafe, reverting to %s");
+        _fmt = "%s";
+      } else {
+        SG_LOG(SG_COCKPIT, SG_WARN, "format type contained %n, but this is unsafe, reverting to %.2f");
+        _fmt = "%.2f";
+      }
+    }
   }
   _node = node;
 }
diff -up flightgear-2.6.0/src/Network/generic.cxx.checkforn flightgear-2.6.0/src/Network/generic.cxx
--- flightgear-2.6.0/src/Network/generic.cxx.checkforn	2012-02-17 17:41:16.428329558 -0500
+++ flightgear-2.6.0/src/Network/generic.cxx	2012-05-29 20:50:37.212255822 -0400
@@ -205,6 +205,8 @@ bool FGGeneric::gen_message_binary() {
 
 bool FGGeneric::gen_message_ascii() {
     string generic_sentence;
+    string unsafe ("%n");
+    size_t found;
     char tmp[255];
     length = 0;
 
@@ -215,6 +217,13 @@ bool FGGeneric::gen_message_ascii() {
             generic_sentence += var_separator;
         }
 
+        // It is never safe for _out_message[i].format.c_str to be %n.
+        found=_out_message[i].format.find(unsafe);
+        if (found!=string::npos) {
+          SG_LOG(SG_COCKPIT, SG_WARN, "format type contained %n, but this is unsafe, reverting to %s");
+          _out_message[i].format = "%s";
+        }
+
         switch (_out_message[i].type) {
         case FG_INT:
             val = _out_message[i].offset +
diff -up flightgear-2.6.0/src/FDM/YASim/Rotor.cpp.rotornamemax256 flightgear-2.6.0/src/FDM/YASim/Rotor.cpp
--- flightgear-2.6.0/src/FDM/YASim/Rotor.cpp.rotornamemax256	2012-05-29 21:17:49.674896892 -0400
+++ flightgear-2.6.0/src/FDM/YASim/Rotor.cpp	2012-05-29 21:20:51.004474076 -0400
@@ -274,7 +274,7 @@ int Rotor::getValueforFGSet(int j,char *
     if (4>numRotorparts()) return 0; //compile first!
     if (j==0)
     {
-        sprintf(text,"/rotors/%s/cone-deg", _name);
+        snprintf(text, 256, "/rotors/%s/cone-deg", _name);
         *f=(_balance1>-1)?( ((Rotorpart*)getRotorpart(0))->getrealAlpha()
             +((Rotorpart*)getRotorpart(1*(_number_of_parts>>2)))->getrealAlpha()
             +((Rotorpart*)getRotorpart(2*(_number_of_parts>>2)))->getrealAlpha()
@@ -284,7 +284,7 @@ int Rotor::getValueforFGSet(int j,char *
     else
         if (j==1)
         {
-            sprintf(text,"/rotors/%s/roll-deg", _name);
+            snprintf(text, 256, "/rotors/%s/roll-deg", _name);
             _roll = ( ((Rotorpart*)getRotorpart(0))->getrealAlpha()
                 -((Rotorpart*)getRotorpart(2*(_number_of_parts>>2)))->getrealAlpha()
                 )/2*(_ccw?-1:1);
@@ -293,7 +293,7 @@ int Rotor::getValueforFGSet(int j,char *
         else
             if (j==2)
             {
-                sprintf(text,"/rotors/%s/yaw-deg", _name);
+                snprintf(text, 256, "/rotors/%s/yaw-deg", _name);
                 _yaw=( ((Rotorpart*)getRotorpart(1*(_number_of_parts>>2)))->getrealAlpha()
                     -((Rotorpart*)getRotorpart(3*(_number_of_parts>>2)))->getrealAlpha()
                     )/2;
@@ -302,38 +302,38 @@ int Rotor::getValueforFGSet(int j,char *
             else
                 if (j==3)
                 {
-                    sprintf(text,"/rotors/%s/rpm", _name);
+                    snprintf(text, 256, "/rotors/%s/rpm", _name);
                     *f=(_balance1>-1)?_omega/2/pi*60:0;
                 }
                 else
                     if (j==4)
                     {
-                        sprintf(text,"/rotors/%s/tilt/pitch-deg",_name);
+                        snprintf(text, 256, "/rotors/%s/tilt/pitch-deg",_name);
                         *f=_tilt_pitch*180/pi;
                     }
                     else if (j==5)
                     {
-                        sprintf(text,"/rotors/%s/tilt/roll-deg",_name);
+                        snprintf(text, 256, "/rotors/%s/tilt/roll-deg",_name);
                         *f=_tilt_roll*180/pi;
                     }
                     else if (j==6)
                     {
-                        sprintf(text,"/rotors/%s/tilt/yaw-deg",_name);
+                        snprintf(text, 256, "/rotors/%s/tilt/yaw-deg",_name);
                         *f=_tilt_yaw*180/pi;
                     }
                     else if (j==7)
                     {
-                        sprintf(text,"/rotors/%s/balance", _name);
+                        snprintf(text, 256, "/rotors/%s/balance", _name);
                         *f=_balance1;
                     }
                     else if (j==8)
                     {
-                        sprintf(text,"/rotors/%s/stall",_name);
+                        snprintf(text, 256, "/rotors/%s/stall",_name);
                         *f=getOverallStall();
                     }
                     else if (j==9)
                     {
-                        sprintf(text,"/rotors/%s/torque",_name);
+                        snprintf(text, 256, "/rotors/%s/torque",_name);
                         *f=-_torque;;
                     }
                     else
@@ -344,7 +344,7 @@ int Rotor::getValueforFGSet(int j,char *
                             return 0;
                         }
                         int w=j%3;
-                        sprintf(text,"/rotors/%s/blade[%i]/%s",
+                        snprintf(text, 256, "/rotors/%s/blade[%i]/%s",
                             _name,b,
                             w==0?"position-deg":(w==1?"flap-deg":"incidence-deg"));
                         *f=((Rotorpart*)getRotorpart(0))->getPhi()*180/pi

Reply via email to