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