Dynamic port remote listener - a BUG?
Damien Miller
djm at mindrot.org
Fri Sep 9 20:18:15 EST 2011
> Hello,
>
> Today I tried using "dynamically assigned" port for remote listener, by
> requesting listener on port 0. This is supposed to create a listener on a
> port choosen by server. Everything seemed OK (the choosen port was sent back
> to client), but forwarding was refused. So I checked the source.
it works for me on both portable and OpenBSD, with -R forwardings on
the initial ssh commandline or set up using -O forward.
> in channels.c, function: channel_setup_fwd_listener
>
> /*
> * listen_port == 0 requests a dynamically allocated port -
> * record what we got.
> */
> if (type == SSH_CHANNEL_RPORT_LISTENER && listen_port == 0
> &&
> allocated_listen_port != NULL &&
> *allocated_listen_port == 0) {
> *allocated_listen_port = get_sock_port(sock, 1);
> debug("Allocated listen port %d",
> *allocated_listen_port);
> }
>
> /* Allocate a channel number for the socket. */
> c = channel_new("port listener", type, sock, sock, -1,
> CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT,
> 0, "port listener", 1);
> c->path = xstrdup(host);
> c->host_port = port_to_connect;
> c->listening_port = listen_port;
> success = 1;
> }
> if (success == 0)
> error("channel_setup_fwd_listener: cannot listen to port:
> %d",
> listen_port);
> freeaddrinfo(aitop);
> return success;
> }
>
> As you see allocated_listen_port gets assigned to some free port, but
> then... nothing more happens with allocated_listen_port, because
> c->listening_port is set to listen_port, which in this case equals 0. (note
> that listen_port IS NOT set to allocated_listen_port!)
>
> But then again - I am not a programmer. So I might be wrong.
listen_port isn't used for all that much, the important thing is the
sock that is bound to the listening port.
-d
More information about the openssh-unix-dev
mailing list