---
server/main.c | 29 ++++++++++++++++++++++++++---
1 file changed, 26 insertions(+), 3 deletions(-)
diff --git a/server/main.c b/server/main.c
index dbeca624..c65c78f7 100644
--- a/server/main.c
+++ b/server/main.c
@@ -614,13 +614,32 @@ main (int argc, char *argv[])
* scripting languages, if magic_config_key == NULL then if the
* first parameter is bare it is prefixed with the key "script", and
* any other bare parameters are errors.
+ *
+ * Keys must live for the life of nbdkit. Since we want to avoid
+ * modifying argv (so that /proc/PID/cmdline remains sane) but we
+ * need to create a key from argv[i] = "key=value" we must save the
+ * keys in an array which is freed at the end of main().
*/
+ char **keys = calloc (argc, sizeof (char *));
+ if (keys == NULL) {
+ perror ("calloc");
+ exit (EXIT_FAILURE);
+ }
+
magic_config_key = top->magic_config_key (top);
for (i = 0; optind < argc; ++i, ++optind) {
+ size_t n;
+
p = strchr (argv[optind], '=');
- if (p && is_config_key (argv[optind], p - argv[optind])) { /* key=value */
- *p = '\0';
- top->config (top, argv[optind], p+1);
+ n = p - argv[optind];
+ if (p && is_config_key (argv[optind], n)) { /* Is it key=value? */
+ keys[optind] = strndup (argv[optind], n);
+
+ if (keys[optind] == NULL) {
+ perror ("strndup");
+ exit (EXIT_FAILURE);
+ }
+ top->config (top, keys[optind], p+1);
}
else if (magic_config_key == NULL) {
if (i == 0) /* magic script parameter */
@@ -679,6 +698,10 @@ main (int argc, char *argv[])
crypto_free ();
close_quit_pipe ();
+ for (i = 1; i < argc; ++i)
+ free (keys[i]);
+ free (keys);
+
/* Note: Don't exit here, otherwise this won't work when compiled
* for libFuzzer.
*/
--
2.24.1