]> andersk Git - openssh.git/commitdiff
- djm@cvs.openbsd.org 2007/06/12 11:11:08
authordtucker <dtucker>
Tue, 12 Jun 2007 13:41:33 +0000 (13:41 +0000)
committerdtucker <dtucker>
Tue, 12 Jun 2007 13:41:33 +0000 (13:41 +0000)
     [ssh.c]
     fix slave exit value when a control master goes away without passing the
     full exit status by ensuring that the slave reads a full int. bz#1261
     reported by frekko AT gmail.com; ok markus@ dtucker@

ChangeLog
ssh.c

index a659fb57cf0a887606fc3addc15e94309bf253f2..884cd2a0c8b9cd8b1a53b9a8ebe5f4b509b957d7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
      depends on the platform supporting sane O_NONBLOCK semantics for open
      on FIFOs (apparently POSIX does not mandate this), which OpenBSD does.
      bz #856; report by cjwatson AT debian.org; ok markus@
+   - djm@cvs.openbsd.org 2007/06/12 11:11:08
+     [ssh.c]
+     fix slave exit value when a control master goes away without passing the
+     full exit status by ensuring that the slave reads a full int. bz#1261
+     reported by frekko AT gmail.com; ok markus@ dtucker@
 
 20070611
  - (djm) Bugzilla #1306: silence spurious error messages from hang-on-exit
diff --git a/ssh.c b/ssh.c
index cfaa1ff227e36fba64e50a6c8e162b00f6186cc2..74c9a091b6b99d468ae9f317998782a5f81b039d 100644 (file)
--- a/ssh.c
+++ b/ssh.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh.c,v 1.295 2007/01/03 03:01:40 stevesk Exp $ */
+/* $OpenBSD: ssh.c,v 1.296 2007/06/12 11:11:08 djm Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -1458,25 +1458,28 @@ control_client(const char *path)
 
        /* Stick around until the controlee closes the client_fd */
        exitval = 0;
-       for (;!control_client_terminate;) {
-               r = read(sock, &exitval, sizeof(exitval));
+       for (i = 0; !control_client_terminate && i < (int)sizeof(exitval);) {
+               r = read(sock, (char *)&exitval + i, sizeof(exitval) - i);
                if (r == 0) {
                        debug2("Received EOF from master");
                        break;
                }
-               if (r > 0)
-                       debug2("Received exit status from master %d", exitval);
                if (r == -1 && errno != EINTR)
                        fatal("%s: read %s", __func__, strerror(errno));
+               i += r;
        }
-
-       if (control_client_terminate)
-               debug2("Exiting on signal %d", control_client_terminate);
-
        close(sock);
-
        leave_raw_mode();
 
+       if (control_client_terminate) {
+               debug2("Exiting on signal %d", control_client_terminate);
+               exitval = 255;
+       } else if (i < (int)sizeof(exitval)) {
+               debug2("Control master terminated unexpectedly");
+               exitval = 255;
+       } else
+               debug2("Received exit status from master %d", exitval);
+
        if (tty_flag && options.log_level != SYSLOG_LEVEL_QUIET)
                fprintf(stderr, "Connection to master closed.\r\n");
 
This page took 1.387849 seconds and 5 git commands to generate.