]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
upstream: allow %n to be expanded in ProxyCommand strings
authordjm@openbsd.org <djm@openbsd.org>
Fri, 13 Sep 2019 04:27:35 +0000 (04:27 +0000)
committerDamien Miller <djm@mindrot.org>
Fri, 13 Sep 2019 04:28:44 +0000 (14:28 +1000)
From Zachary Harmany via github.com/openssh/openssh-portable/pull/118
ok dtucker@

OpenBSD-Commit-ID: 7eebf1b7695f50c66d42053d352a4db9e8fb84b6

ssh.c
ssh_config.5
sshconnect.c
sshconnect.h

diff --git a/ssh.c b/ssh.c
index cb321bcf369a2010ad456699b92cb5fd8c36d7e8..ee51823cd833397c4ffb5abe1d1ac2bc1e095fab 100644 (file)
--- a/ssh.c
+++ b/ssh.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh.c,v 1.506 2019/09/06 14:45:34 naddy Exp $ */
+/* $OpenBSD: ssh.c,v 1.507 2019/09/13 04:27:35 djm Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -1369,7 +1369,7 @@ main(int ac, char **av)
        timeout_ms = options.connection_timeout * 1000;
 
        /* Open a connection to the remote host. */
-       if (ssh_connect(ssh, host, addrs, &hostaddr, options.port,
+       if (ssh_connect(ssh, host_arg, host, addrs, &hostaddr, options.port,
            options.address_family, options.connection_attempts,
            &timeout_ms, options.tcp_keep_alive) != 0)
                exit(255);
index b10c55492d0a28a9bec9ad6b3dcf329f35f00c97..867c916a70190060d5a3afafa2133905214389e6 100644 (file)
@@ -33,7 +33,7 @@
 .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.\" $OpenBSD: ssh_config.5,v 1.302 2019/09/13 04:07:42 djm Exp $
+.\" $OpenBSD: ssh_config.5,v 1.303 2019/09/13 04:27:35 djm Exp $
 .Dd $Mdocdate: September 13 2019 $
 .Dt SSH_CONFIG 5
 .Os
@@ -1821,7 +1821,7 @@ accept the tokens %%, %d, %h, %i, %l, %r, and %u.
 accepts the tokens %%, %C, %d, %h, %i, %l, %n, %p, %r, %T, and %u.
 .Pp
 .Cm ProxyCommand
-accepts the tokens %%, %h, %p, and %r.
+accepts the tokens %%, %h, %n, %p, and %r.
 .Pp
 .Cm RemoteCommand
 accepts the tokens %%, %C, %d, %h, %i, %l, %n, %p, %r, and %u.
index ed44fccb89235f3a3feca461255bcbf9d1efdd91..7407804430af9cea066d07bdece1ff0a596c9b43 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: sshconnect.c,v 1.317 2019/06/28 13:35:04 deraadt Exp $ */
+/* $OpenBSD: sshconnect.c,v 1.318 2019/09/13 04:27:35 djm Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -87,14 +87,18 @@ static void warn_changed_key(struct sshkey *);
 /* Expand a proxy command */
 static char *
 expand_proxy_command(const char *proxy_command, const char *user,
-    const char *host, int port)
+    const char *host, const char *host_arg, int port)
 {
        char *tmp, *ret, strport[NI_MAXSERV];
 
        snprintf(strport, sizeof strport, "%d", port);
        xasprintf(&tmp, "exec %s", proxy_command);
-       ret = percent_expand(tmp, "h", host, "p", strport,
-           "r", options.user, (char *)NULL);
+       ret = percent_expand(tmp,
+           "h", host,
+           "n", host_arg,
+           "p", strport,
+           "r", options.user,
+           (char *)NULL);
        free(tmp);
        return ret;
 }
@@ -122,8 +126,8 @@ stderr_null(void)
  * a connected fd back to us.
  */
 static int
-ssh_proxy_fdpass_connect(struct ssh *ssh, const char *host, u_short port,
-    const char *proxy_command)
+ssh_proxy_fdpass_connect(struct ssh *ssh, const char *host,
+    const char *host_arg, u_short port, const char *proxy_command)
 {
        char *command_string;
        int sp[2], sock;
@@ -138,7 +142,7 @@ ssh_proxy_fdpass_connect(struct ssh *ssh, const char *host, u_short port,
                    "proxy dialer: %.100s", strerror(errno));
 
        command_string = expand_proxy_command(proxy_command, options.user,
-           host, port);
+           host_arg, host, port);
        debug("Executing proxy dialer command: %.500s", command_string);
 
        /* Fork and execute the proxy command. */
@@ -204,8 +208,8 @@ ssh_proxy_fdpass_connect(struct ssh *ssh, const char *host, u_short port,
  * Connect to the given ssh server using a proxy command.
  */
 static int
-ssh_proxy_connect(struct ssh *ssh, const char *host, u_short port,
-    const char *proxy_command)
+ssh_proxy_connect(struct ssh *ssh, const char *host, const char *host_arg,
+    u_short port, const char *proxy_command)
 {
        char *command_string;
        int pin[2], pout[2];
@@ -221,7 +225,7 @@ ssh_proxy_connect(struct ssh *ssh, const char *host, u_short port,
                    strerror(errno));
 
        command_string = expand_proxy_command(proxy_command, options.user,
-           host, port);
+           host_arg, host, port);
        debug("Executing proxy command: %.500s", command_string);
 
        /* Fork and execute the proxy command. */
@@ -543,9 +547,9 @@ ssh_connect_direct(struct ssh *ssh, const char *host, struct addrinfo *aitop,
 }
 
 int
-ssh_connect(struct ssh *ssh, const char *host, struct addrinfo *addrs,
-    struct sockaddr_storage *hostaddr, u_short port, int family,
-    int connection_attempts, int *timeout_ms, int want_keepalive)
+ssh_connect(struct ssh *ssh, const char *host, const char *host_arg,
+    struct addrinfo *addrs, struct sockaddr_storage *hostaddr, u_short port,
+    int family, int connection_attempts, int *timeout_ms, int want_keepalive)
 {
        int in, out;
 
@@ -564,10 +568,11 @@ ssh_connect(struct ssh *ssh, const char *host, struct addrinfo *addrs,
                        return -1; /* ssh_packet_set_connection logs error */
                return 0;
        } else if (options.proxy_use_fdpass) {
-               return ssh_proxy_fdpass_connect(ssh, host, port,
+               return ssh_proxy_fdpass_connect(ssh, host, host_arg, port,
                    options.proxy_command);
        }
-       return ssh_proxy_connect(ssh, host, port, options.proxy_command);
+       return ssh_proxy_connect(ssh, host, host_arg, port,
+           options.proxy_command);
 }
 
 /* defaults to 'no' */
index b455d7c20b59c9d3a2e64454058539401935df2e..2e84b8bc523c4d9270943d9b5e2d762ccc325917 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: sshconnect.h,v 1.38 2019/06/21 04:21:05 djm Exp $ */
+/* $OpenBSD: sshconnect.h,v 1.39 2019/09/13 04:27:35 djm Exp $ */
 
 /*
  * Copyright (c) 2000 Markus Friedl.  All rights reserved.
@@ -33,8 +33,9 @@ struct Sensitive {
 struct addrinfo;
 struct ssh;
 
-int     ssh_connect(struct ssh *, const char *, struct addrinfo *,
-           struct sockaddr_storage *, u_short, int, int, int *, int);
+int     ssh_connect(struct ssh *, const char *, const char *,
+           struct addrinfo *, struct sockaddr_storage *, u_short,
+           int, int, int *, int);
 void    ssh_kill_proxy_command(void);
 
 void    ssh_login(struct ssh *, Sensitive *, const char *,