From 415d3605e046c61a66ef714de8a6dce4a4314666 Mon Sep 17 00:00:00 2001 From: Paul Crowley Date: Mon, 14 Dec 2015 15:52:19 +0000 Subject: [PATCH] Avoid use of a macro when checking argument count. Change-Id: Ia697de58b983233c78e9ef8eb93098d50dfda931 --- CryptCommandListener.cpp | 66 ++++++++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 26 deletions(-) diff --git a/CryptCommandListener.cpp b/CryptCommandListener.cpp index 5de5cf2..7361c78 100644 --- a/CryptCommandListener.cpp +++ b/CryptCommandListener.cpp @@ -29,6 +29,8 @@ #include #include +#include + #define LOG_TAG "VoldCryptCmdListener" #include @@ -122,13 +124,25 @@ static char* parseNull(char* arg) { } } -#define CHECK_ARGC(expected, error) \ - do { \ - if (argc != (expected)) { \ - cli->sendMsg(ResponseCode::CommandSyntaxError, ("Usage: cryptfs " error), false); \ - return 0; \ - } \ - } while (0) +static bool check_argc(SocketClient *cli, const std::string &subcommand, int argc, + int expected, std::string usage) { + assert(expected >= 2); + if (expected == 2) { + assert(usage.empty()); + } else { + assert(!usage.empty()); + assert(std::count(usage.begin(), usage.end(), ' ') + 3 == expected); + } + if (argc == expected) { + return true; + } + auto message = std::string() + "Usage: cryptfs " + subcommand; + if (!usage.empty()) { + message += " " + usage; + } + cli->sendMsg(ResponseCode::CommandSyntaxError, message.c_str(), false); + return false; +} int CryptCommandListener::CryptfsCmd::runCommand(SocketClient *cli, int argc, char **argv) { @@ -138,7 +152,7 @@ int CryptCommandListener::CryptfsCmd::runCommand(SocketClient *cli, } if (argc < 2) { - cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false); + cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing subcommand", false); return 0; } @@ -146,15 +160,15 @@ int CryptCommandListener::CryptfsCmd::runCommand(SocketClient *cli, std::string subcommand(argv[1]); if (subcommand == "checkpw") { - CHECK_ARGC(3, "checkpw "); + if (!check_argc(cli, subcommand, argc, 3, "")) return 0; dumpArgs(argc, argv, 2); rc = cryptfs_check_passwd(argv[2]); } else if (subcommand == "restart") { - CHECK_ARGC(2, "restart"); + if (!check_argc(cli, subcommand, argc, 2, "")) return 0; dumpArgs(argc, argv, -1); rc = cryptfs_restart(); } else if (subcommand == "cryptocomplete") { - CHECK_ARGC(2, "cryptocomplete"); + if (!check_argc(cli, subcommand, argc, 2, "")) return 0; dumpArgs(argc, argv, -1); rc = cryptfs_crypto_complete(); } else if (subcommand == "enablecrypto") { @@ -228,7 +242,7 @@ int CryptCommandListener::CryptfsCmd::runCommand(SocketClient *cli, } } } else if (subcommand == "enablefilecrypto") { - CHECK_ARGC(2, "enablefilecrypto"); + if (!check_argc(cli, subcommand, argc, 2, "")) return 0; dumpArgs(argc, argv, -1); rc = cryptfs_enable_file(); } else if (subcommand == "changepw") { @@ -251,11 +265,11 @@ int CryptCommandListener::CryptfsCmd::runCommand(SocketClient *cli, SLOGD("cryptfs changepw %s {}", argv[2]); rc = cryptfs_changepw(type, password); } else if (subcommand == "verifypw") { - CHECK_ARGC(3, "verifypw "); + if (!check_argc(cli, subcommand, argc, 3, "")) return 0; SLOGD("cryptfs verifypw {}"); rc = cryptfs_verify_passwd(argv[2]); } else if (subcommand == "getfield") { - CHECK_ARGC(3, "getfield "); + if (!check_argc(cli, subcommand, argc, 3, "")) return 0; char *valbuf; int valbuf_len = PROPERTY_VALUE_MAX; @@ -280,16 +294,16 @@ int CryptCommandListener::CryptfsCmd::runCommand(SocketClient *cli, } free(valbuf); } else if (subcommand == "setfield") { - CHECK_ARGC(4, "setfield "); + if (!check_argc(cli, subcommand, argc, 4, " ")) return 0; dumpArgs(argc, argv, -1); rc = cryptfs_setfield(argv[2], argv[3]); } else if (subcommand == "mountdefaultencrypted") { - CHECK_ARGC(2, "mountdefaultencrypted"); + if (!check_argc(cli, subcommand, argc, 2, "")) return 0; SLOGD("cryptfs mountdefaultencrypted"); dumpArgs(argc, argv, -1); rc = cryptfs_mount_default_encrypted(); } else if (subcommand == "getpwtype") { - CHECK_ARGC(2, "getpwtype"); + if (!check_argc(cli, subcommand, argc, 2, "")) return 0; SLOGD("cryptfs getpwtype"); dumpArgs(argc, argv, -1); switch(cryptfs_get_password_type()) { @@ -311,7 +325,7 @@ int CryptCommandListener::CryptfsCmd::runCommand(SocketClient *cli, return 0; } } else if (subcommand == "getpw") { - CHECK_ARGC(2, "getpw"); + if (!check_argc(cli, subcommand, argc, 2, "")) return 0; SLOGD("cryptfs getpw"); dumpArgs(argc, argv, -1); const char* password = cryptfs_get_password(); @@ -327,45 +341,45 @@ int CryptCommandListener::CryptfsCmd::runCommand(SocketClient *cli, } rc = -1; } else if (subcommand == "clearpw") { - CHECK_ARGC(2, "clearpw"); + if (!check_argc(cli, subcommand, argc, 2, "")) return 0; SLOGD("cryptfs clearpw"); dumpArgs(argc, argv, -1); cryptfs_clear_password(); rc = 0; } else if (subcommand == "setusercryptopolicies") { - CHECK_ARGC(3, "setusercryptopolicies "); + if (!check_argc(cli, subcommand, argc, 3, "")) return 0; SLOGD("cryptfs setusercryptopolicies"); dumpArgs(argc, argv, -1); rc = e4crypt_vold_set_user_crypto_policies(argv[2]); } else if (subcommand == "isConvertibleToFBE") { - CHECK_ARGC(2, "isConvertibleToFBE"); + if (!check_argc(cli, subcommand, argc, 2, "")) return 0; // ext4enc:TODO: send a CommandSyntaxError if argv[2] not an integer SLOGD("cryptfs isConvertibleToFBE"); dumpArgs(argc, argv, -1); rc = cryptfs_isConvertibleToFBE(); } else if (subcommand == "create_user_key") { - CHECK_ARGC(5, "create_user_key "); + if (!check_argc(cli, subcommand, argc, 5, " ")) return 0; return sendGenericOkFail(cli, e4crypt_vold_create_user_key(atoi(argv[2]), atoi(argv[3]), atoi(argv[4]) != 0)); } else if (subcommand == "destroy_user_key") { - CHECK_ARGC(3, "destroy_user_key "); + if (!check_argc(cli, subcommand, argc, 3, "")) return 0; return sendGenericOkFail(cli, e4crypt_destroy_user_key(atoi(argv[2]))); } else if (subcommand == "unlock_user_key") { - CHECK_ARGC(5, "unlock_user_key "); + if (!check_argc(cli, subcommand, argc, 5, " ")) return 0; return sendGenericOkFail(cli, e4crypt_unlock_user_key(atoi(argv[2]), parseNull(argv[4]))); } else if (subcommand == "lock_user_key") { - CHECK_ARGC(3, "lock_user_key "); + if (!check_argc(cli, subcommand, argc, 3, "")) return 0; return sendGenericOkFail(cli, e4crypt_lock_user_key(atoi(argv[2]))); } else if (subcommand == "prepare_user_storage") { - CHECK_ARGC(6, "prepare_user_storage "); + if (!check_argc(cli, subcommand, argc, 6, " ")) return 0; return sendGenericOkFail(cli, e4crypt_prepare_user_storage(parseNull(argv[2]), atoi(argv[3]),