]> git.mxchange.org Git - simgear.git/commitdiff
Printf format sanitising.
authorJames Turner <zakalawe@mac.com>
Sun, 15 Sep 2013 12:30:12 +0000 (13:30 +0100)
committerJames Turner <zakalawe@mac.com>
Sun, 15 Sep 2013 12:30:12 +0000 (13:30 +0100)
Refactored version for next, use a new helper in
simgear::strutils.

simgear/misc/strutils.cxx
simgear/misc/strutils.hxx
simgear/scene/model/SGText.cxx

index ff16e64cf377887853fc9566d0d309719898494e..47f0b4ef82132ee7b5b82836e3727429960498b0 100644 (file)
@@ -26,6 +26,8 @@
 
 #include "strutils.hxx"
 
+#include <simgear/debug/logstream.hxx>
+
 using std::string;
 using std::vector;
 using std::stringstream;
@@ -484,6 +486,17 @@ std::string unescape(const char* s)
   return r;
 }
 
+string sanitizePrintfFormat(const string& input)
+{
+    string::size_type i = input.find("%n");
+    if (i != string::npos) {
+        SG_LOG(SG_IO, SG_WARN, "sanitizePrintfFormat: bad format string:" << input);
+        return string();
+    }
+    
+    return input;
+}
+
 } // end namespace strutils
     
 } // end namespace simgear
index 73e24fc458adae44db74c24a06e93650a96de447..977aa894a0dc44dd6bfafa1ee93e85d1dccd216f 100644 (file)
@@ -137,7 +137,7 @@ namespace simgear {
     
     /**
      * Like strcmp(), but for dotted versions strings NN.NN.NN
-     * any number of terms are support.
+     * any number of terms are supported.
      * @return 0 if versions match, -ve number if v1 is lower, +ve if v1
      * is greater
      */
@@ -180,6 +180,13 @@ namespace simgear {
 
     inline std::string unescape(const std::string& str)
     { return unescape(str.c_str()); }
+      
+      /**
+       * Check a printf-style format string for dangerous (buffer-overflowing,
+       * memory re-writing) format tokens. If a problematic token is
+       * found, logs an error (SG_WARN) and returns an empty format string.
+       */
+      std::string sanitizePrintfFormat(const std::string& input);
 
   } // end namespace strutils
 } // end namespace simgear
index 747e4098022875bb3d34551a74ee0b54b54ac218..fdb7fe9657450f455a5defc47adcd1d850992218 100644 (file)
@@ -26,6 +26,7 @@
 
 #include <simgear/math/SGMath.hxx>
 #include <simgear/misc/sg_path.hxx>
+#include <simgear/misc/strutils.hxx>
 
 #include <osg/Geode>
 #include <osg/MatrixTransform>
@@ -43,7 +44,7 @@ public:
     offset( aOffset ),
     truncate( aTruncate ),
     numeric( aNumeric ),
-    format( aFormat )
+    format( simgear::strutils::sanitizePrintfFormat( aFormat ) )
   {
     if( format.empty() ) {
       if( numeric ) format = "%f";