diff mbox

[1/2] Fix segfault caused by invalid argument string.

Message ID 1307555952-10340-1-git-send-email-samlang@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Sam Lang June 8, 2011, 5:59 p.m. UTC
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>
---
 src/crushtool.cc |   14 ++++++++------
 1 files changed, 8 insertions(+), 6 deletions(-)
diff mbox

Patch

diff --git a/src/crushtool.cc b/src/crushtool.cc
index 73c303b..64b2b4f 100644
--- a/src/crushtool.cc
+++ b/src/crushtool.cc
@@ -54,6 +54,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());
@@ -141,8 +143,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") {
@@ -936,14 +938,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