diff options
Diffstat (limited to 'tools/lvmcmdline.c')
-rw-r--r-- | tools/lvmcmdline.c | 41 |
1 files changed, 25 insertions, 16 deletions
diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c index 6dbc1894a..403948a52 100644 --- a/tools/lvmcmdline.c +++ b/tools/lvmcmdline.c @@ -1463,6 +1463,8 @@ static int _init_lvmlockd(struct cmd_context *cmd) return 1; } +#define MAX_ARG_LEN 64 + int lvm_run_command(struct cmd_context *cmd, int argc, char **argv) { struct dm_config_tree *config_string_cft; @@ -1470,8 +1472,10 @@ int lvm_run_command(struct cmd_context *cmd, int argc, char **argv) int ret = 0; int locking_type; int monitoring; - char *arg_new, *arg; - int i; + char arg_new[MAX_ARG_LEN]; + char *arg; + int quit_arg_hyphen_removal; + int i, j, j_new; init_error_message_produced(0); @@ -1479,24 +1483,29 @@ int lvm_run_command(struct cmd_context *cmd, int argc, char **argv) sigint_clear(); /* eliminate '-' from all options starting with -- */ - for (i = 1; i < argc; ++i) { - - if (argv[i][0] != '-' || argv[i][1] != '-') - continue; + for (i = 1; i < argc; i++) { + quit_arg_hyphen_removal = 0; + arg = argv[i]; - arg_new = arg = argv[i] + 2; + if (arg[0] == '-' && arg[1] == '-' && strlen(arg) == 2) + break; - while (*arg) { - if (*arg != '-') { - if (arg_new != arg) - *arg_new = *arg; - ++arg_new; + if (arg[0] == '-' && arg[1] == '-' && strlen(arg) < MAX_ARG_LEN) { + memset(arg_new, 0, sizeof(arg_new)); + arg_new[0] = '-'; + arg_new[1] = '-'; + + for (j = 2, j_new = 2; j < strlen(arg) + 1; j++) { + if (arg[j] == '=') + quit_arg_hyphen_removal = 1; + if (!quit_arg_hyphen_removal && arg[j] == '-') + continue; + arg_new[j_new] = arg[j]; + j_new++; } - ++arg; - } - if (arg_new != arg) - *arg_new = 0; + memcpy(argv[i], arg_new, strlen(arg_new) + 1); + } } if (!(cmd->cmd_line = _copy_command_line(cmd, argc, argv))) |