diff options
author | Damien Miller <djm@cvs.openbsd.org> | 2023-09-06 23:23:54 +0000 |
---|---|---|
committer | Damien Miller <djm@cvs.openbsd.org> | 2023-09-06 23:23:54 +0000 |
commit | 1ae0f63ee14cfe2fcce42590592dc20599839857 (patch) | |
tree | c8711d4a8d16147cf3dd0c237b503ef01dd869d3 | |
parent | 9692132eafd6bf54a020bf4fb5db0fa5030e99f4 (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.c | 24 |
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; |