From d654dd27b5774575edd341827c38735ac9222174 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Mon, 19 May 2008 16:05:41 +1000 Subject: [PATCH] - markus@cvs.openbsd.org 2008/05/09 16:17:51 [channels.c] error-fd race: don't enable the error fd in the select bitmask for channels with both in- and output closed, since the channel will go away before we call select(); report, lots of debugging help and ok djm@ --- ChangeLog | 8 +++++++- channels.c | 5 +++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 513fbe243..fd75c3404 100644 --- a/ChangeLog +++ b/ChangeLog @@ -127,6 +127,12 @@ a SIGPIPE when the forked program does a write. ok djm@ (Id sync only, USE_PIPES never left portable OpenSSH) + - markus@cvs.openbsd.org 2008/05/09 16:17:51 + [channels.c] + error-fd race: don't enable the error fd in the select bitmask + for channels with both in- and output closed, since the channel + will go away before we call select(); + report, lots of debugging help and ok djm@ 20080403 - (djm) [openbsd-compat/bsd-poll.c] Include stdlib.h to avoid compile- @@ -3987,4 +3993,4 @@ OpenServer 6 and add osr5bigcrypt support so when someone migrates passwords between UnixWare and OpenServer they will still work. OK dtucker@ -$Id: ChangeLog,v 1.4928 2008/05/19 06:04:56 djm Exp $ +$Id: ChangeLog,v 1.4929 2008/05/19 06:05:41 djm Exp $ diff --git a/channels.c b/channels.c index 1e57951dc..99b23d75f 100644 --- a/channels.c +++ b/channels.c @@ -1,4 +1,4 @@ -/* $OpenBSD: channels.c,v 1.276 2008/05/09 04:55:56 djm Exp $ */ +/* $OpenBSD: channels.c,v 1.277 2008/05/09 16:17:51 markus Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -819,7 +819,8 @@ channel_pre_open(Channel *c, fd_set *readset, fd_set *writeset) } } /** XXX check close conditions, too */ - if (compat20 && c->efd != -1) { + if (compat20 && c->efd != -1 && + !(c->istate == CHAN_INPUT_CLOSED && c->ostate == CHAN_OUTPUT_CLOSED)) { if (c->extended_usage == CHAN_EXTENDED_WRITE && buffer_len(&c->extended) > 0) FD_SET(c->efd, writeset);