a010b40938
Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
124 lines
3.8 KiB
Diff
124 lines
3.8 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: DeHackEd <DeHackEd@users.noreply.github.com>
|
|
Date: Mon, 20 Aug 2018 12:55:18 -0400
|
|
Subject: [PATCH] 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
|
|
|
|
Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
|
|
---
|
|
cmd/zfs/zfs_main.c | 18 ++++++++++++++++--
|
|
cmd/zpool/zpool_main.c | 18 ++++++++++++++++--
|
|
2 files changed, 32 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/cmd/zfs/zfs_main.c b/cmd/zfs/zfs_main.c
|
|
index f57df858..275d9c89 100644
|
|
--- a/cmd/zfs/zfs_main.c
|
|
+++ b/cmd/zfs/zfs_main.c
|
|
@@ -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);
|
|
@@ -7096,16 +7097,25 @@ 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);
|
|
|
|
diff --git a/cmd/zpool/zpool_main.c b/cmd/zpool/zpool_main.c
|
|
index 97697011..a4fd0321 100644
|
|
--- a/cmd/zpool/zpool_main.c
|
|
+++ b/cmd/zpool/zpool_main.c
|
|
@@ -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);
|
|
@@ -8006,15 +8007,24 @@ 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);
|
|
|