When remote side fails to create tun (e.g. tun device is already opened)
it notifies the client with an SSH2_MSG_CHANNEL_OPEN_FAILURE message and
channel is marked dead on client side. But because tun forward channel
is not an interactive channel it has no cleanup callback and is kept in
a Zombie state until ssh is manually terminated.

This makes "ssh -Nw" to not fail and exit in such situation even if
ExitOnForwardFailure is set.

This patch registers a cleanup callback to tun forward channel if
ExitOnForwardFailure is set so that "ssh -Nw" exit directly when
remote fails to established the tunnel correctly on its side.

Index: usr.bin/ssh/clientloop.c
===================================================================
RCS file: /cvs/src/usr.bin/ssh/clientloop.c,v
retrieving revision 1.340
diff -u -p -r1.340 clientloop.c
--- usr.bin/ssh/clientloop.c    2 Feb 2020 09:45:34 -0000       1.340
+++ usr.bin/ssh/clientloop.c    17 Feb 2020 15:42:59 -0000
@@ -1673,6 +1673,11 @@ client_request_tun_fwd(struct ssh *ssh, 
            (r = sshpkt_send(ssh)) != 0)
                sshpkt_fatal(ssh, r, "%s: send reply", __func__);
 
+       if (options.exit_on_forward_failure) {
+               channel_register_cleanup(ssh, c->self,
+                   client_channel_closed, 0);
+       }
+
        return ifname;
 }
 

Reply via email to