summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Miller <djm@cvs.openbsd.org>2023-09-06 23:23:54 +0000
committerDamien Miller <djm@cvs.openbsd.org>2023-09-06 23:23:54 +0000
commit1ae0f63ee14cfe2fcce42590592dc20599839857 (patch)
treec8711d4a8d16147cf3dd0c237b503ef01dd869d3
parent9692132eafd6bf54a020bf4fb5db0fa5030e99f4 (diff)
preserve quoting of Subsystem commands and arguments. This may change
behaviour of exotic configurations, but the most common subsystem configuration (sftp-server) is unlikely to be affected.
-rw-r--r--usr.bin/ssh/servconf.c24
1 files changed, 11 insertions, 13 deletions
diff --git a/usr.bin/ssh/servconf.c b/usr.bin/ssh/servconf.c
index 308661e568e..a19f6dd8149 100644
--- a/usr.bin/ssh/servconf.c
+++ b/usr.bin/ssh/servconf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: servconf.c,v 1.398 2023/09/06 23:21:36 djm Exp $ */
+/* $OpenBSD: servconf.c,v 1.399 2023/09/06 23:23:53 djm Exp $ */
/*
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
* All rights reserved
@@ -1903,21 +1903,19 @@ process_server_config_line_depth(ServerOptions *options, char *line,
}
options->subsystem_name[options->num_subsystems] = xstrdup(arg);
arg = argv_next(&ac, &av);
- if (!arg || *arg == '\0')
+ if (!arg || *arg == '\0') {
fatal("%s line %d: Missing subsystem command.",
filename, linenum);
- options->subsystem_command[options->num_subsystems] = xstrdup(arg);
-
- /* Collect arguments (separate to executable) */
- p = xstrdup(arg);
- len = strlen(p) + 1;
- while ((arg = argv_next(&ac, &av)) != NULL) {
- len += 1 + strlen(arg);
- p = xreallocarray(p, 1, len);
- strlcat(p, " ", len);
- strlcat(p, arg, len);
}
- options->subsystem_args[options->num_subsystems] = p;
+ options->subsystem_command[options->num_subsystems] =
+ xstrdup(arg);
+ /* Collect arguments (separate to executable) */
+ arg = argv_assemble(1, &arg); /* quote command correctly */
+ arg2 = argv_assemble(ac, av); /* rest of command */
+ xasprintf(&options->subsystem_args[options->num_subsystems],
+ "%s %s", arg, arg2);
+ free(arg2);
+ argv_consume(&ac);
options->num_subsystems++;
break;