]> andersk Git - openssh.git/commitdiff
- djm@cvs.openbsd.org 2008/07/02 13:47:39
authordtucker <dtucker>
Fri, 4 Jul 2008 02:53:50 +0000 (02:53 +0000)
committerdtucker <dtucker>
Fri, 4 Jul 2008 02:53:50 +0000 (02:53 +0000)
     [ssh.1 ssh.c]
     When forking after authentication ("ssh -f") with ExitOnForwardFailure
     enabled, delay the fork until after replies for any -R forwards have
     been seen. Allows for robust detection of -R forward failure when
     using -f (similar to bz#92); ok dtucker@

ChangeLog
ssh.1
ssh.c

index eb2706b84755d1ad2c7579c0c8d11d37eb3e9718..b5945b843335ec25da79a1edbce59409454ebddc 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,6 +3,12 @@
    - djm@cvs.openbsd.org 2008/07/02 13:30:34
      [auth2.c]
      really really remove the freebie "none" auth try for protocol 2
+   - djm@cvs.openbsd.org 2008/07/02 13:47:39
+     [ssh.1 ssh.c]
+     When forking after authentication ("ssh -f") with ExitOnForwardFailure
+     enabled, delay the fork until after replies for any -R forwards have
+     been seen. Allows for robust detection of -R forward failure when
+     using -f (similar to bz#92); ok dtucker@
 
 20080702
  - (dtucker) OpenBSD CVS Sync
diff --git a/ssh.1 b/ssh.1
index cf6538f1f8af658299e57cc71efa64abe6c7e38c..09a644ef13219b035de07d458f6937ba94051bc6 100644 (file)
--- a/ssh.1
+++ b/ssh.1
@@ -34,7 +34,7 @@
 .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.\" $OpenBSD: ssh.1,v 1.276 2008/06/26 21:11:46 jmc Exp $
+.\" $OpenBSD: ssh.1,v 1.277 2008/07/02 13:47:39 djm Exp $
 .Dd $Mdocdate$
 .Dt SSH 1
 .Os
@@ -290,6 +290,15 @@ This implies
 The recommended way to start X11 programs at a remote site is with
 something like
 .Ic ssh -f host xterm .
+.Pp
+If the
+.Cm ExitOnForwardFailure
+configuration option is set to
+.Dq yes ,
+then a client started with
+.Fl f
+will wait for all remote port forwards to be successfully established
+before placing itself in the background.
 .It Fl g
 Allows remote hosts to connect to local forwarded ports.
 .It Fl I Ar smartcard_device
diff --git a/ssh.c b/ssh.c
index c15a1e4839da642d9f7c97b08ab29eb5993f17c7..e2dd67d688bdad9a74c94180a03bf5b50da3314f 100644 (file)
--- a/ssh.c
+++ b/ssh.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh.c,v 1.317 2008/06/12 16:35:31 dtucker Exp $ */
+/* $OpenBSD: ssh.c,v 1.318 2008/07/02 13:47:39 djm Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -860,9 +860,15 @@ ssh_confirm_remote_forward(int type, u_int32_t seq, void *ctxt)
                        logit("Warning: remote port forwarding failed for "
                            "listen port %d", rfwd->listen_port);
        }
-       if (++remote_forward_confirms_received == options.num_remote_forwards)
+       if (++remote_forward_confirms_received == options.num_remote_forwards) {
                debug("All remote forwarding requests processed");
-               /* XXX fork-after-authentication */
+               if (fork_after_authentication_flag) {
+                       fork_after_authentication_flag = 0;
+                       if (daemon(1, 1) < 0)
+                               fatal("daemon() failed: %.200s",
+                                   strerror(errno));
+               }
+       }
 }
 
 static void
@@ -1062,10 +1068,17 @@ ssh_session(void)
            options.permit_local_command)
                ssh_local_cmd(options.local_command);
 
-       /* If requested, let ssh continue in the background. */
-       if (fork_after_authentication_flag)
+       /*
+        * If requested and we are not interested in replies to remote
+        * forwarding requests, then let ssh continue in the background.
+        */
+       if (fork_after_authentication_flag &&
+           (!options.exit_on_forward_failure ||
+           options.num_remote_forwards == 0)) {
+               fork_after_authentication_flag = 0;
                if (daemon(1, 1) < 0)
                        fatal("daemon() failed: %.200s", strerror(errno));
+       }
 
        /*
         * If a command was specified on the command line, execute the
@@ -1204,9 +1217,11 @@ ssh_session2(void)
        muxserver_listen();
 
        /* If requested, let ssh continue in the background. */
-       if (fork_after_authentication_flag)
+       if (fork_after_authentication_flag) {
+               fork_after_authentication_flag = 0;
                if (daemon(1, 1) < 0)
                        fatal("daemon() failed: %.200s", strerror(errno));
+       }
 
        return client_loop(tty_flag, tty_flag ?
            options.escape_char : SSH_ESCAPECHAR_NONE, id);
This page took 0.08628 seconds and 5 git commands to generate.