]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
- djm@cvs.openbsd.org 2013/12/19 01:04:36
authorDamien Miller <djm@mindrot.org>
Sun, 29 Dec 2013 06:45:26 +0000 (17:45 +1100)
committerDamien Miller <djm@mindrot.org>
Sun, 29 Dec 2013 06:45:26 +0000 (17:45 +1100)
     [channels.c]
     bz#2147: fix multiple remote forwardings with dynamically assigned
     listen ports. In the s->c message to open the channel we were sending
     zero (the magic number to request a dynamic port) instead of the actual
     listen port. The client therefore had no way of discriminating between
     them.

     Diagnosis and fix by ronf AT timeheart.net

ChangeLog
channels.c

index a3689a4afbce87aa7b574f1f0da55af0ed0b25ad..c22c8b4def9c4d3d928c19168b7ea3f8e7e021a8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
    - djm@cvs.openbsd.org 2013/12/19 00:27:57
      [auth-options.c]
      simplify freeing of source-address certificate restriction
+   - djm@cvs.openbsd.org 2013/12/19 01:04:36
+     [channels.c]
+     bz#2147: fix multiple remote forwardings with dynamically assigned
+     listen ports. In the s->c message to open the channel we were sending
+     zero (the magic number to request a dynamic port) instead of the actual
+     listen port. The client therefore had no way of discriminating between
+     them.
+     
+     Diagnosis and fix by ronf AT timeheart.net
 
 20131221
  - (dtucker) [regress/keytype.sh] Actually test ecdsa key types.
index c9df9bac5e17c1b4becd58834e051df2bc9dd933..e741f29b97b05ea4b7ffa10aa1f3aff436e7a78e 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: channels.c,v 1.327 2013/11/08 00:39:15 djm Exp $ */
+/* $OpenBSD: channels.c,v 1.328 2013/12/19 01:04:36 djm Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -1385,6 +1385,8 @@ port_open_helper(Channel *c, char *rtype)
 {
        int direct;
        char buf[1024];
+       char *local_ipaddr = get_local_ipaddr(c->sock);
+       int local_port = get_sock_port(c->sock, 1);
        char *remote_ipaddr = get_peer_ipaddr(c->sock);
        int remote_port = get_peer_port(c->sock);
 
@@ -1399,9 +1401,9 @@ port_open_helper(Channel *c, char *rtype)
 
        snprintf(buf, sizeof buf,
            "%s: listening port %d for %.100s port %d, "
-           "connect from %.200s port %d",
+           "connect from %.200s port %d to %.100s port %d",
            rtype, c->listening_port, c->path, c->host_port,
-           remote_ipaddr, remote_port);
+           remote_ipaddr, remote_port, local_ipaddr, local_port);
 
        free(c->remote_name);
        c->remote_name = xstrdup(buf);
@@ -1419,7 +1421,7 @@ port_open_helper(Channel *c, char *rtype)
                } else {
                        /* listen address, port */
                        packet_put_cstring(c->path);
-                       packet_put_int(c->listening_port);
+                       packet_put_int(local_port);
                }
                /* originator host and port */
                packet_put_cstring(remote_ipaddr);
@@ -1436,6 +1438,7 @@ port_open_helper(Channel *c, char *rtype)
                packet_send();
        }
        free(remote_ipaddr);
+       free(local_ipaddr);
 }
 
 static void