update from MirBSD CVS
[alioth/cvs.git] / src / rsh-client.c
index 2db873e..5d88202 100644 (file)
@@ -15,7 +15,7 @@
 #include "cvs.h"
 #include "buffer.h"
 
-__RCSID("$MirOS: src/gnu/usr.bin/cvs/src/rsh-client.c,v 1.6 2017/03/26 15:54:10 tg Exp $");
+__RCSID("$MirOS: src/gnu/usr.bin/cvs/src/rsh-client.c,v 1.7 2017/08/11 20:41:40 tg Exp $");
 
 #ifdef CLIENT_SUPPORT
 
@@ -55,8 +55,9 @@ start_rsh_server (cvsroot_t *root, struct buffer **to_server_p,
     char *cvs_server = (root->cvs_server != NULL
                        ? root->cvs_server : getenv ("CVS_SERVER"));
     int i = 0;
-    /* This needs to fit "rsh", "-b", "-l", "USER", "-p", port, "host",
-       "cmd (w/ args)", and NULL.  We leave some room to grow. */
+    /* This needs to fit "rsh", "-b", "-l", "USER", "-p", port,
+       "--", "host", "cvs", "-R", "server", and NULL.
+       We leave some room to grow. */
     char *rsh_argv[16];
     char argvport[16];
 
@@ -107,6 +108,9 @@ start_rsh_server (cvsroot_t *root, struct buffer **to_server_p,
        rsh_argv[i++] = argvport;
     }
 
+    /* Only non-option arguments from here. (CVE-2017-12836) */
+    rsh_argv[i++] = "--";
+
     rsh_argv[i++] = root->hostname;
     rsh_argv[i++] = cvs_server;
     if (readonlyfs)
@@ -191,6 +195,8 @@ start_rsh_server (cvsroot_t *root, struct buffer **to_server_p,
                *p++ = argvport;
        }
 
+       *p++ = "--";
+
        *p++ = root->hostname;
        *p++ = command;
        *p++ = NULL;