From 2705af401226a5f62871369e20eb1713a0b05baa Mon Sep 17 00:00:00 2001 From: Thulinma Date: Mon, 15 Apr 2013 10:45:56 +0200 Subject: [PATCH] Fixed memory corruption in optionless binaries. --- lib/config.cpp | 60 ++++++++++++++++++++++++++------------------------ 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/lib/config.cpp b/lib/config.cpp index 0bfafb79..c083d5ec 100644 --- a/lib/config.cpp +++ b/lib/config.cpp @@ -28,7 +28,7 @@ std::string Util::Config::libver = PACKAGE_VERSION; /// Creates a new configuration manager. Util::Config::Config(std::string cmd, std::string version){ vals.null(); - long_count = 0; + long_count = 2; vals["cmd"]["value"].append(cmd); vals["version"]["long"] = "version"; vals["version"]["short"] = "v"; @@ -173,38 +173,40 @@ void Util::Config::parseArgs(int argc, char ** argv){ struct option * longOpts = (struct option*)calloc(long_count + 1, sizeof(struct option)); int long_i = 0; int arg_count = 0; - for (JSON::ObjIter it = vals.ObjBegin(); it != vals.ObjEnd(); it++){ - if (it->second.isMember("short")){ - shortopts += it->second["short"].asString(); - if (it->second.isMember("arg")){ - shortopts += ":"; + if (vals.size()){ + for (JSON::ObjIter it = vals.ObjBegin(); it != vals.ObjEnd(); it++){ + if (it->second.isMember("short")){ + shortopts += it->second["short"].asString(); + if (it->second.isMember("arg")){ + shortopts += ":"; + } } - } - if (it->second.isMember("short_off")){ - shortopts += it->second["short_off"].asString(); - if (it->second.isMember("arg")){ - shortopts += ":"; + if (it->second.isMember("short_off")){ + shortopts += it->second["short_off"].asString(); + if (it->second.isMember("arg")){ + shortopts += ":"; + } } - } - if (it->second.isMember("long")){ - longOpts[long_i].name = it->second["long"].asString().c_str(); - longOpts[long_i].val = it->second["short"].asString()[0]; - if (it->second.isMember("arg")){ - longOpts[long_i].has_arg = 1; + if (it->second.isMember("long")){ + longOpts[long_i].name = it->second["long"].asString().c_str(); + longOpts[long_i].val = it->second["short"].asString()[0]; + if (it->second.isMember("arg")){ + longOpts[long_i].has_arg = 1; + } + long_i++; } - long_i++; - } - if (it->second.isMember("long_off")){ - longOpts[long_i].name = it->second["long_off"].asString().c_str(); - longOpts[long_i].val = it->second["short_off"].asString()[0]; - if (it->second.isMember("arg")){ - longOpts[long_i].has_arg = 1; + if (it->second.isMember("long_off")){ + longOpts[long_i].name = it->second["long_off"].asString().c_str(); + longOpts[long_i].val = it->second["short_off"].asString()[0]; + if (it->second.isMember("arg")){ + longOpts[long_i].has_arg = 1; + } + long_i++; } - long_i++; - } - if (it->second.isMember("arg_num") && !(it->second.isMember("value") && it->second["value"].size())){ - if (it->second["arg_num"].asInt() > arg_count){ - arg_count = it->second["arg_num"].asInt(); + if (it->second.isMember("arg_num") && !(it->second.isMember("value") && it->second["value"].size())){ + if (it->second["arg_num"].asInt() > arg_count){ + arg_count = it->second["arg_num"].asInt(); + } } } }