From 2944082b3f84b5260a748a529f90cd18a6187610 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 8 Jan 2010 17:08:35 +1100 Subject: [PATCH] - 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 --- ChangeLog | 4 ++++ clientloop.c | 18 ++++++++++-------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 96e338c00..72d5a21e1 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 540a6181a..eca87777f 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 * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -1856,15 +1856,17 @@ client_input_channel_req(int type, u_int32_t seq, void *ctxt) 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(); }