Patch for a port forwarding problem in serverloop.c

Markus Friedl markus at openbsd.org
Sun Feb 23 04:16:24 EST 2003


hm, ssh protocol messages should be used and the
client should close the connection, not the server.

thanks!

On Sat, Feb 22, 2003 at 11:37:31AM -0500, jam at McQuil.Com wrote:
> Hello all,
> 
> I encountered a problem when trying to setup a remote portforward
> using OpenSSH 3.5p1.
> 
> If the port that I was trying to listen to on the remote side
> was already in use, a message 'cannot bind to port: 5000' was
> written to the syslog, but the connection still persisted.
> 
> I had no way on the client side to know that the listening
> wasn't taking place.  that is, the portforwarding of port 5000
> failed, but the ssh connection on port 22 was still there.
> 
> I found the spot in serverloop.c, where it seemed to be
> ignoring the return status from the 'channel_setup_remote_fwd_listener'
> call.
> 
> The fix for me was a simple testing of the success, and calling
> fatal() to indicate that the port forwarding failed.
> 
> Here is the patch:
> 
> 
> --- serverloop.c.orig	Sat Feb 22 11:35:39 2003
> +++ serverloop.c	Sat Feb 22 11:19:29 2003
> @@ -989,6 +989,9 @@
>  			/* Start listening on the port */
>  			success = channel_setup_remote_fwd_listener(
>  			    listen_address, listen_port, options.gateway_ports);
> +                        if( !success ){
> +				fatal("Cannot bind to the remote port");
> +			}
>  		}
>  		xfree(listen_address);
>  	}
> 
> 
> And, here is the commandline that I used to initiate the connection:
> 
> 
> while :; do
> 
>    ssh -N -R 5000:localhost:5000  user at remotesystem
> 
>    sleep 10
> 
> done  
> 
> 
> My patch is not terribly robust.  I suppose that if you didn't use
> the '-N' option, you may not want the connection to disappear, but
> in my case, if the port forwarding fails, I really need the
> connection to drop, so I can go into a loop and retry it.
> 
> The reason I need this, is that i'm setting up a forwarded port
> when I boot the client.  If I reboot the client, the old connection
> lingers for a couple of minutes on the remote machine, before
> it realizes that the client has gone away.  When the client comes
> back up, and tries to re-establish the forwarded port, it can't.
> 
> So, now with my patch, the client will realize that the port forward
> request failed, and it will sit in a loop, and try every 10 seconds,
> until the connection succeeds.
> 
> Anyway, thanks, and I hope you find my patch useful.
> 
> Jim McQuillan
> jam at Ltsp.org

> --- serverloop.c.orig	Sat Feb 22 11:35:39 2003
> +++ serverloop.c	Sat Feb 22 11:19:29 2003
> @@ -989,6 +989,9 @@
>  			/* Start listening on the port */
>  			success = channel_setup_remote_fwd_listener(
>  			    listen_address, listen_port, options.gateway_ports);
> +                        if( !success ){
> +				fatal("Cannot bind to the remote port");
> +			}
>  		}
>  		xfree(listen_address);
>  	}




More information about the openssh-unix-dev mailing list