]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
Fix segfault caused by invalid argument string.
authorSam Lang <samlang@gmail.com>
Wed, 8 Jun 2011 17:59:11 +0000 (12:59 -0500)
committerSage Weil <sage@newdream.net>
Wed, 8 Jun 2011 18:25:13 +0000 (11:25 -0700)
This patchset includes minor fixes to the crushtool utility.  If an invalid bucket type is speicifed on the command line, the code was iterating through bucket_types for the length of the static array, but the last entry in that array has null (0) values, which was causing a segfault.  This patch just checks that bucket_types[i].name is non-null instead.  Also, if the wrong bucket type or algorithm is specified, prints the usage string on exit.

Signed-off-by: Sam Lang <samlang@gmail.com>
Signed-off-by: Sage Weil <sage@newdream.net>
src/crushtool.cc

index 45b2d58afab075cfe5190d643f273c882d11065f..6c48f290286e7bacba452534dd7723beb701e33f 100644 (file)
@@ -55,6 +55,8 @@ map<string, int> type_id;
 
 map<string, int> rule_id;
 
+void usage();
+
 string string_node(node_t &node)
 {
   string s = string(node.value.begin(), node.value.end());
@@ -142,8 +144,8 @@ void parse_bucket(iter_t const& i, CrushWrapper &crush)
       else if (a == "straw")
        alg = CRUSH_BUCKET_STRAW;
       else {
-       cerr << "unknown bucket alg '" << a << "'" << std::endl;
-       exit(1);
+       cerr << "unknown bucket alg '" << a << "'" << std::endl << std::endl;
+       usage();
       }
     }
     else if (tag == "hash") {
@@ -980,14 +982,14 @@ int main(int argc, const char **argv)
       crush.set_type_name(type, l.name);
 
       int buckettype = -1;
-      for (int i = 0; i < (int)(sizeof(bucket_types)/sizeof(bucket_types[0])); i++)
-       if (strcmp(l.buckettype, bucket_types[i].name) == 0) {
+      for (int i = 0; bucket_types[i].name; i++)
+       if (l.buckettype && strcmp(l.buckettype, bucket_types[i].name) == 0) {
          buckettype = bucket_types[i].type;
          break;
        }
       if (buckettype < 0) {
-       cerr << "unknown bucket type '" << l.buckettype << "'" << std::endl;
-       exit(1);
+       cerr << "unknown bucket type '" << l.buckettype << "'" << std::endl << std::endl;
+       usage();
       }
 
       // build items