diff options
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | channels.c | 11 |
2 files changed, 16 insertions, 4 deletions
@@ -14,6 +14,15 @@ | |||
14 | - djm@cvs.openbsd.org 2013/12/19 00:27:57 | 14 | - djm@cvs.openbsd.org 2013/12/19 00:27:57 |
15 | [auth-options.c] | 15 | [auth-options.c] |
16 | simplify freeing of source-address certificate restriction | 16 | simplify freeing of source-address certificate restriction |
17 | - djm@cvs.openbsd.org 2013/12/19 01:04:36 | ||
18 | [channels.c] | ||
19 | bz#2147: fix multiple remote forwardings with dynamically assigned | ||
20 | listen ports. In the s->c message to open the channel we were sending | ||
21 | zero (the magic number to request a dynamic port) instead of the actual | ||
22 | listen port. The client therefore had no way of discriminating between | ||
23 | them. | ||
24 | |||
25 | Diagnosis and fix by ronf AT timeheart.net | ||
17 | 26 | ||
18 | 20131221 | 27 | 20131221 |
19 | - (dtucker) [regress/keytype.sh] Actually test ecdsa key types. | 28 | - (dtucker) [regress/keytype.sh] Actually test ecdsa key types. |
diff --git a/channels.c b/channels.c index c9df9bac5..e741f29b9 100644 --- a/channels.c +++ b/channels.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: channels.c,v 1.327 2013/11/08 00:39:15 djm Exp $ */ | 1 | /* $OpenBSD: channels.c,v 1.328 2013/12/19 01:04:36 djm Exp $ */ |
2 | /* | 2 | /* |
3 | * Author: Tatu Ylonen <ylo@cs.hut.fi> | 3 | * Author: Tatu Ylonen <ylo@cs.hut.fi> |
4 | * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland | 4 | * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland |
@@ -1385,6 +1385,8 @@ port_open_helper(Channel *c, char *rtype) | |||
1385 | { | 1385 | { |
1386 | int direct; | 1386 | int direct; |
1387 | char buf[1024]; | 1387 | char buf[1024]; |
1388 | char *local_ipaddr = get_local_ipaddr(c->sock); | ||
1389 | int local_port = get_sock_port(c->sock, 1); | ||
1388 | char *remote_ipaddr = get_peer_ipaddr(c->sock); | 1390 | char *remote_ipaddr = get_peer_ipaddr(c->sock); |
1389 | int remote_port = get_peer_port(c->sock); | 1391 | int remote_port = get_peer_port(c->sock); |
1390 | 1392 | ||
@@ -1399,9 +1401,9 @@ port_open_helper(Channel *c, char *rtype) | |||
1399 | 1401 | ||
1400 | snprintf(buf, sizeof buf, | 1402 | snprintf(buf, sizeof buf, |
1401 | "%s: listening port %d for %.100s port %d, " | 1403 | "%s: listening port %d for %.100s port %d, " |
1402 | "connect from %.200s port %d", | 1404 | "connect from %.200s port %d to %.100s port %d", |
1403 | rtype, c->listening_port, c->path, c->host_port, | 1405 | rtype, c->listening_port, c->path, c->host_port, |
1404 | remote_ipaddr, remote_port); | 1406 | remote_ipaddr, remote_port, local_ipaddr, local_port); |
1405 | 1407 | ||
1406 | free(c->remote_name); | 1408 | free(c->remote_name); |
1407 | c->remote_name = xstrdup(buf); | 1409 | c->remote_name = xstrdup(buf); |
@@ -1419,7 +1421,7 @@ port_open_helper(Channel *c, char *rtype) | |||
1419 | } else { | 1421 | } else { |
1420 | /* listen address, port */ | 1422 | /* listen address, port */ |
1421 | packet_put_cstring(c->path); | 1423 | packet_put_cstring(c->path); |
1422 | packet_put_int(c->listening_port); | 1424 | packet_put_int(local_port); |
1423 | } | 1425 | } |
1424 | /* originator host and port */ | 1426 | /* originator host and port */ |
1425 | packet_put_cstring(remote_ipaddr); | 1427 | packet_put_cstring(remote_ipaddr); |
@@ -1436,6 +1438,7 @@ port_open_helper(Channel *c, char *rtype) | |||
1436 | packet_send(); | 1438 | packet_send(); |
1437 | } | 1439 | } |
1438 | free(remote_ipaddr); | 1440 | free(remote_ipaddr); |
1441 | free(local_ipaddr); | ||
1439 | } | 1442 | } |
1440 | 1443 | ||
1441 | static void | 1444 | static void |