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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxx>
---
 src/crushtool.cc |   14 ++++++++------
 1 files changed, 8 insertions(+), 6 deletions(-)

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
-- 
1.7.1

--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [CEPH Users]     [Ceph Large]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux