mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-26 03:09:34 +03:00
Don't modify argv[] in user tools
argv[] gets modified during string parsing for input arguments. This is reflected in the live process listing. Don't do that. Reviewed-by: Serapheim Dimitropoulos <serapheim@delphix.com> Reviewed-by: loli10K <ezomori.nozomu@gmail.com> Reviewed-by: Giuseppe Di Natale <guss80@gmail.com> Reviewed-by: George Melikov <mail@gmelikov.ru> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: DHE <git@dehacked.net> Closes #7760
This commit is contained in:
parent
98bc8e0b23
commit
778290d5bc
@ -7041,6 +7041,7 @@ main(int argc, char **argv)
|
||||
int ret = 0;
|
||||
int i = 0;
|
||||
char *cmdname;
|
||||
char **newargv;
|
||||
|
||||
(void) setlocale(LC_ALL, "");
|
||||
(void) textdomain(TEXT_DOMAIN);
|
||||
@ -7095,17 +7096,26 @@ main(int argc, char **argv)
|
||||
|
||||
libzfs_print_on_error(g_zfs, B_TRUE);
|
||||
|
||||
/*
|
||||
* Many commands modify input strings for string parsing reasons.
|
||||
* We create a copy to protect the original argv.
|
||||
*/
|
||||
newargv = malloc((argc + 1) * sizeof (newargv[0]));
|
||||
for (i = 0; i < argc; i++)
|
||||
newargv[i] = strdup(argv[i]);
|
||||
newargv[argc] = NULL;
|
||||
|
||||
/*
|
||||
* Run the appropriate command.
|
||||
*/
|
||||
libzfs_mnttab_cache(g_zfs, B_TRUE);
|
||||
if (find_command_idx(cmdname, &i) == 0) {
|
||||
current_command = &command_table[i];
|
||||
ret = command_table[i].func(argc - 1, argv + 1);
|
||||
ret = command_table[i].func(argc - 1, newargv + 1);
|
||||
} else if (strchr(cmdname, '=') != NULL) {
|
||||
verify(find_command_idx("set", &i) == 0);
|
||||
current_command = &command_table[i];
|
||||
ret = command_table[i].func(argc, argv);
|
||||
ret = command_table[i].func(argc, newargv);
|
||||
} else {
|
||||
(void) fprintf(stderr, gettext("unrecognized "
|
||||
"command '%s'\n"), cmdname);
|
||||
@ -7113,6 +7123,10 @@ main(int argc, char **argv)
|
||||
ret = 1;
|
||||
}
|
||||
|
||||
for (i = 0; i < argc; i++)
|
||||
free(newargv[i]);
|
||||
free(newargv);
|
||||
|
||||
if (ret == 0 && log_history)
|
||||
(void) zpool_log_history(g_zfs, history_str);
|
||||
|
||||
|
@ -7971,6 +7971,7 @@ main(int argc, char **argv)
|
||||
int ret = 0;
|
||||
int i = 0;
|
||||
char *cmdname;
|
||||
char **newargv;
|
||||
|
||||
(void) setlocale(LC_ALL, "");
|
||||
(void) textdomain(TEXT_DOMAIN);
|
||||
@ -8005,16 +8006,25 @@ main(int argc, char **argv)
|
||||
|
||||
zfs_save_arguments(argc, argv, history_str, sizeof (history_str));
|
||||
|
||||
/*
|
||||
* Many commands modify input strings for string parsing reasons.
|
||||
* We create a copy to protect the original argv.
|
||||
*/
|
||||
newargv = malloc((argc + 1) * sizeof (newargv[0]));
|
||||
for (i = 0; i < argc; i++)
|
||||
newargv[i] = strdup(argv[i]);
|
||||
newargv[argc] = NULL;
|
||||
|
||||
/*
|
||||
* Run the appropriate command.
|
||||
*/
|
||||
if (find_command_idx(cmdname, &i) == 0) {
|
||||
current_command = &command_table[i];
|
||||
ret = command_table[i].func(argc - 1, argv + 1);
|
||||
ret = command_table[i].func(argc - 1, newargv + 1);
|
||||
} else if (strchr(cmdname, '=')) {
|
||||
verify(find_command_idx("set", &i) == 0);
|
||||
current_command = &command_table[i];
|
||||
ret = command_table[i].func(argc, argv);
|
||||
ret = command_table[i].func(argc, newargv);
|
||||
} else if (strcmp(cmdname, "freeze") == 0 && argc == 3) {
|
||||
/*
|
||||
* 'freeze' is a vile debugging abomination, so we treat
|
||||
@ -8031,6 +8041,10 @@ main(int argc, char **argv)
|
||||
ret = 1;
|
||||
}
|
||||
|
||||
for (i = 0; i < argc; i++)
|
||||
free(newargv[i]);
|
||||
free(newargv);
|
||||
|
||||
if (ret == 0 && log_history)
|
||||
(void) zpool_log_history(g_zfs, history_str);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user