]> git.mxchange.org Git - flightgear.git/commitdiff
Make fgValidatePath always return std::string, not char *
authorRebecca N. Palmer <rebecca_palmer@zoho.com>
Fri, 13 Mar 2015 18:07:24 +0000 (18:07 +0000)
committerRebecca N. Palmer <rebecca_palmer@zoho.com>
Fri, 13 Mar 2015 18:07:24 +0000 (18:07 +0000)
src/Canvas/FGCanvasSystemAdapter.cxx
src/Main/fg_commands.cxx
src/Main/util.cxx
src/Main/util.hxx
src/Scripting/NasalSys.cxx

index 95b6b65a65b514d90a08c35089ffd5b53e2e9736..c85b0fa28250976e8e16cdccb9e389f9160e3377 100644 (file)
@@ -81,9 +81,9 @@ namespace canvas
   {
     if( SGPath(path).isAbsolute() )
     {
-      const char* valid_path = fgValidatePath(path.c_str(), false);
-      if( valid_path )
-        return osgDB::readImageFile(valid_path);
+      std::string valid_path = fgValidatePath(path, false);
+      if( !valid_path.empty() )
+        return osgDB::readImageFile(valid_path.c_str());
 
       SG_LOG(SG_IO, SG_ALERT, "canvas::Image: reading '" << path << "' denied");
     }
index cdc21d38d1c0ca006a03687773c67ab6be4efb5b..8c9539f5da336d9d0b16337c0a3ca815543bcd27 100644 (file)
@@ -284,7 +284,7 @@ do_load (const SGPropertyNode * arg)
     if (file.size() < 4 || file.substr(file.size() - 4) != ".sav")
         file += ".sav";
 
-    if (!fgValidatePath(file.c_str(), false)) {
+    if (fgValidatePath(file, false).empty()) {
         SG_LOG(SG_IO, SG_ALERT, "load: reading '" << file << "' denied "
                 "(unauthorized access)");
         return false;
@@ -315,7 +315,7 @@ do_save (const SGPropertyNode * arg)
     if (file.size() < 4 || file.substr(file.size() - 4) != ".sav")
         file += ".sav";
 
-    if (!fgValidatePath(file.c_str(), false)) {
+    if (fgValidatePath(file, false).empty()) {
         SG_LOG(SG_IO, SG_ALERT, "save: writing '" << file << "' denied "
                 "(unauthorized access)");
         return false;
@@ -1166,7 +1166,7 @@ do_load_xml_to_proptree(const SGPropertyNode * arg)
         }
     }
     
-    if (!fgValidatePath(file.c_str(), false)) {
+    if (fgValidatePath(file, false).empty()) {
         SG_LOG(SG_IO, SG_ALERT, "loadxml: reading '" << file.str() << "' denied "
                 "(unauthorized access)");
         return false;
@@ -1248,7 +1248,7 @@ do_save_xml_from_proptree(const SGPropertyNode * arg)
     if (file.extension() != "xml")
         file.concat(".xml");
 
-    if (!fgValidatePath(file.c_str(), true)) {
+    if (fgValidatePath(file, true).empty()) {
         SG_LOG(SG_IO, SG_ALERT, "savexml: writing to '" << file.str() << "' denied "
                 "(unauthorized access)");
         return false;
index 28ee477359db9e884742ebe2220d0daaa5c4d2e7..b5ea49dc6c6c8253852425b81d456b63f5b79e24 100644 (file)
@@ -116,14 +116,15 @@ void fgInitAllowedPaths()
     write_allowed_paths.push_back(globals->get_fg_home() + "/runtime-jetways/*.xml");
     write_allowed_paths.push_back(globals->get_fg_home() + "/Input/Joysticks/*.xml");
     
+    // Check that it works
     if(!fgValidatePath(globals->get_fg_home() + "/../no.log",true).empty() ||
         !fgValidatePath(globals->get_fg_home() + "/no.lot",true).empty() ||
-        fgValidatePath((globals->get_fg_home() + "/nolog").c_str(),true) ||
+        !fgValidatePath(globals->get_fg_home() + "/nolog",true).empty() ||
         !fgValidatePath(globals->get_fg_home() + "no.log",true).empty() ||
         !fgValidatePath("..\\" + globals->get_fg_home() + "/no.log",false).empty() ||
-        fgValidatePath("/tmp/no.xml",false) ||
+        !fgValidatePath(std::string("/tmp/no.xml"),false).empty() ||
         fgValidatePath(globals->get_fg_home() + "/./ff/../Export\\yes..gg",true).empty() ||
-        !fgValidatePath((globals->get_fg_home() + "/aircraft-data/yes..xml").c_str(),true) ||
+        fgValidatePath(globals->get_fg_home() + "/aircraft-data/yes..xml",true).empty() ||
         fgValidatePath(globals->get_fg_root() + "/./\\yes.bmp",false).empty()) {
             flightgear::fatalMessageBox("Nasal initialization error",
                                     "fgInitAllowedPaths() does not work",
@@ -199,15 +200,6 @@ std::string fgValidatePath (const std::string& path, bool write)
     // no match found
     return "";
 }
-// s.c_str() becomes invalid when s is destroyed, so need a static s
-std::string validate_path_temp;
-const char* fgValidatePath(const char* path, bool write)
-{
-  validate_path_temp = fgValidatePath(std::string(path), write);
-  if(validate_path_temp.empty()){
-      return 0;
-  }
-  return validate_path_temp.c_str();
-}
+std::string fgValidatePath(const SGPath& path, bool write) { return fgValidatePath(path.str(),write); }
 // end of util.cxx
 
index 37f401d955274b4332d3c75583c103d4ed560542..133f1526ec3acdeb6e9e249c28605a81885fbcc2 100644 (file)
@@ -21,6 +21,7 @@
 #define __UTIL_HXX 1
 
 #include <string>
+#include <simgear/misc/sg_path.hxx>
 
 /**
  * Move a value towards a target.
@@ -41,7 +42,7 @@ double fgGetLowPass (double current, double target, double timeratio);
  * @param write True for write operations and false for read operations.
  * @return The validated path on success or 0 if access denied.
  */
-const char *fgValidatePath (const char *path, bool write);
+std::string fgValidatePath(const SGPath& path, bool write);
 std::string fgValidatePath(const std::string& path, bool write);
 
 /**
index 49cf79a36da3f9679eb21bafc5fc7fadc4a65713..1fc511a507cbbd223f7b9a1b3302df5001c0554f 100644 (file)
@@ -703,22 +703,22 @@ static naRef f_parsexml(naContext c, naRef me, int argc, naRef* args)
         if(!(naIsNil(args[i]) || naIsFunc(args[i])))
             naRuntimeError(c, "parsexml(): callback argument not a function");
 
-    const char* file = fgValidatePath(naStr_data(args[0]), false);
-    if(!file) {
+    std::string file = fgValidatePath(naStr_data(args[0]), false);
+    if(file.empty()) {
         naRuntimeError(c, "parsexml(): reading '%s' denied "
                 "(unauthorized access)", naStr_data(args[0]));
         return naNil();
     }
-    std::ifstream input(file);
+    std::ifstream input(file.c_str());
     NasalXMLVisitor visitor(c, argc, args);
     try {
         readXML(input, visitor);
     } catch (const sg_exception& e) {
         naRuntimeError(c, "parsexml(): file '%s' %s",
-                file, e.getFormattedMessage().c_str());
+                file.c_str(), e.getFormattedMessage().c_str());
         return naNil();
     }
-    return naStr_fromdata(naNewString(c), const_cast<char*>(file), strlen(file));
+    return naStr_fromdata(naNewString(c), file.c_str(), file.length());
 }
 
 /**