preserve quoting of Subsystem commands and arguments. This may change
authordjm <djm@openbsd.org>
Wed, 6 Sep 2023 23:23:53 +0000 (23:23 +0000)
committerdjm <djm@openbsd.org>
Wed, 6 Sep 2023 23:23:53 +0000 (23:23 +0000)
behaviour of exotic configurations, but the most common subsystem
configuration (sftp-server) is unlikely to be affected.

usr.bin/ssh/servconf.c

index 308661e..a19f6dd 100644 (file)
@@ -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;