summaryrefslogtreecommitdiff
path: root/tools/lvmcmdline.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/lvmcmdline.c')
-rw-r--r--tools/lvmcmdline.c41
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)))