summaryrefslogtreecommitdiff
path: root/channels.c
diff options
context:
space:
mode:
authortb@openbsd.org <tb@openbsd.org>2018-02-05 05:36:49 +0000
committerDarren Tucker <dtucker@dtucker.net>2018-02-07 07:50:46 +1100
commit5069320be93c8b2a6584b9f944c86f60c2b04e48 (patch)
treedd0f63c43b93b37d9ea52165bd5e72634c70437e /channels.c
parent2b428f90ea1b21d7a7c68ec1ee334253b3f9324d (diff)
upstream commit
The file descriptors for socket, stdin, stdout and stderr aren't necessarily distinct, so check if they are the same to avoid closing the same fd several times. ok djm OpenBSD-Commit-ID: 60d71fd22e9a32f5639d4ba6e25a2f417fc36ac1
Diffstat (limited to 'channels.c')
-rw-r--r--channels.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/channels.c b/channels.c
index 1c381e0e..bdee1f38 100644
--- a/channels.c
+++ b/channels.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: channels.c,v 1.378 2018/01/23 05:27:21 djm Exp $ */
+/* $OpenBSD: channels.c,v 1.379 2018/02/05 05:36:49 tb Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -436,10 +436,15 @@ channel_close_fd(struct ssh *ssh, int *fdp)
static void
channel_close_fds(struct ssh *ssh, Channel *c)
{
+ int sock = c->sock, rfd = c->rfd, wfd = c->wfd, efd = c->efd;
+
channel_close_fd(ssh, &c->sock);
- channel_close_fd(ssh, &c->rfd);
- channel_close_fd(ssh, &c->wfd);
- channel_close_fd(ssh, &c->efd);
+ if (rfd != sock)
+ channel_close_fd(ssh, &c->rfd);
+ if (wfd != sock && wfd != rfd)
+ channel_close_fd(ssh, &c->wfd);
+ if (efd != sock && efd != rfd && efd != wfd)
+ channel_close_fd(ssh, &c->efd);
}
static void