You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by tr...@apache.org on 2008/05/29 23:18:56 UTC

svn commit: r661483 - /incubator/qpid/trunk/qpid/cpp/src/qpid/Options.cpp

Author: tross
Date: Thu May 29 14:18:56 2008
New Revision: 661483

URL: http://svn.apache.org/viewvc?rev=661483&view=rev
Log:
QPID-1100 crash when config file contains commented-out commands (patch from michael goulish)

Modified:
    incubator/qpid/trunk/qpid/cpp/src/qpid/Options.cpp

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/Options.cpp
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/Options.cpp?rev=661483&r1=661482&r2=661483&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/Options.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/Options.cpp Thu May 29 14:18:56 2008
@@ -115,7 +115,24 @@
         return string();
     }
 
+
+    bool
+    isComment ( string const & str )
+    {
+      size_t i = str.find_first_not_of ( " \t" );
+
+      if ( i == string::npos )
+        return true;
+
+      return str[i] == '#';
+    }
+
+
     string configFileLine (string& line) {
+        
+        if ( isComment ( line ) )
+          return string();
+
         size_t pos = line.find ('=');
         if (pos == string::npos)
             return string();
@@ -126,14 +143,16 @@
             find_if(opts.options().begin(), opts.options().end(), boost::bind(matchCase, key, _1));
         if (i != opts.options().end())
             return string (line) + "\n";
+        else
+          return string();
 #else
-        try {
-            po::option_description desc = opts.find(key.c_str());
-            return string (line) + "\n";
-        }
-        catch (const std::exception& e) {}
+        // Use 'count' to see if this option exists.  Using 'find' will SEGV or hang
+        // if the option has not been defined yet.
+        if ( opts.count(key.c_str()) > 0 )
+          return string ( line ) + "\n";
+        else
+          return string ( );
 #endif
-        return string ();
     }
 
     const Options& opts;
@@ -190,19 +209,19 @@
 
       for ( int i = 0; i < argc; ++ i )
       {
-	string s = argv[i];
-	int equals_pos = s.find_first_of ( '=' );
+        string s = argv[i];
+        size_t equals_pos = s.find_first_of ( '=' );
 
-	if ( string::npos == equals_pos )  // There's no equals sign.  This is a token.
-	{
-	  tokenized_argv.push_back(s);
-	}
-	else
-	{
-	  // Two tokens -- before and after the equals position.
-	  tokenized_argv.push_back ( s.substr(0, equals_pos) );
-	  tokenized_argv.push_back ( s.substr(equals_pos+1) );
-	}
+        if ( string::npos == equals_pos )  // There's no equals sign.  This is a token.
+        {
+          tokenized_argv.push_back(s);
+        }
+        else
+        {
+          // Two tokens -- before and after the equals position.
+          tokenized_argv.push_back ( s.substr(0, equals_pos) );
+          tokenized_argv.push_back ( s.substr(equals_pos+1) );
+        }
       }
 
 
@@ -224,35 +243,35 @@
       while ( iter < the_end )
       {
        /*
-	* If this is an argument that is registered,
-	* copy it to filtered_argv and also copy all
-	* of its arguments.
-	*/
+        * If this is an argument that is registered,
+        * copy it to filtered_argv and also copy all
+        * of its arguments.
+        */
        if ( is_registered_option ( * iter ) )
        {
-	 // Store this recognized arg.
-	 filtered_argv.push_back ( * iter );
-	 ++ iter;
-
-	 // Copy all values for the above arg.
-	 // Args are tokens that do not start with a minus.
-	 while ( (iter < the_end) && ((* iter)[0] != '-') )
-	 {
-	   filtered_argv.push_back ( * iter );
-	   ++ iter;
-	 }
+         // Store this recognized arg.
+         filtered_argv.push_back ( * iter );
+         ++ iter;
+
+         // Copy all values for the above arg.
+         // Args are tokens that do not start with a minus.
+         while ( (iter < the_end) && ((* iter)[0] != '-') )
+         {
+           filtered_argv.push_back ( * iter );
+           ++ iter;
+         }
        }
        else
        {
-	 // Skip this unrecognized arg.
-	 ++ iter;
+         // Skip this unrecognized arg.
+         ++ iter;
 
-	 // Copy all values for the above arg.
-	 // Values are tokens that do not start with a minus.
-	 while ( (iter < the_end) && ( '-' != (*iter)[0] ) )
-	 {
-	   ++ iter;
-	 }
+         // Copy all values for the above arg.
+         // Values are tokens that do not start with a minus.
+         while ( (iter < the_end) && ( '-' != (*iter)[0] ) )
+         {
+           ++ iter;
+         }
        }
      }
 
@@ -264,9 +283,9 @@
 
      // cout << "NEW ARGV: |";
      for ( iter = filtered_argv.begin();
-	   iter < filtered_argv.end();
-	   ++ iter, ++ i
-	 )
+           iter < filtered_argv.end();
+           ++ iter, ++ i
+         )
      {
        new_argv[i] = strdup( (* iter).c_str() );
        // cout << " " << new_argv[i] ;