- djm@cvs.openbsd.org 2009/11/17 05:31:44
[clientloop.c]
fix incorrect exit status when multiplexing and channel ID 0 is recycled
bz#1570 reported by peter.oliver AT eon-is.co.uk; ok dtucker
diff --git a/ChangeLog b/ChangeLog
index 96e338c..72d5a21 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -57,6 +57,10 @@
the end of the select read/write fdset and make sure a reused FD
is not touched before the pre-handlers are called.
with and ok djm@
+ - djm@cvs.openbsd.org 2009/11/17 05:31:44
+ [clientloop.c]
+ fix incorrect exit status when multiplexing and channel ID 0 is recycled
+ bz#1570 reported by peter.oliver AT eon-is.co.uk; ok dtucker
20091226
- (tim) [contrib/cygwin/Makefile] Install ssh-copy-id and ssh-copy-id.1
diff --git a/clientloop.c b/clientloop.c
index 540a618..eca8777 100644
--- a/clientloop.c
+++ b/clientloop.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: clientloop.c,v 1.214 2009/10/24 11:15:29 andreas Exp $ */
+/* $OpenBSD: clientloop.c,v 1.215 2009/11/17 05:31:44 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -1856,15 +1856,17 @@
chan_rcvd_eow(c);
} else if (strcmp(rtype, "exit-status") == 0) {
exitval = packet_get_int();
- if (id == session_ident) {
- success = 1;
- exit_status = exitval;
- } else if (c->ctl_fd == -1) {
- error("client_input_channel_req: unexpected channel %d",
- session_ident);
- } else {
+ if (c->ctl_fd != -1) {
+ /* Dispatch to mux client */
atomicio(vwrite, c->ctl_fd, &exitval, sizeof(exitval));
success = 1;
+ } else if (id == session_ident) {
+ /* Record exit value of local session */
+ success = 1;
+ exit_status = exitval;
+ } else {
+ error("client_input_channel_req: unexpected channel %d",
+ session_ident);
}
packet_check_eom();
}