summaryrefslogtreecommitdiff
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
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
-rw-r--r--channels.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/channels.c b/channels.c
index 1c381e0e2..bdee1f386 100644
--- a/channels.c
+++ b/channels.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: channels.c,v 1.378 2018/01/23 05:27:21 djm Exp $ */ 1/* $OpenBSD: channels.c,v 1.379 2018/02/05 05:36:49 tb Exp $ */
2/* 2/*
3 * Author: Tatu Ylonen <ylo@cs.hut.fi> 3 * Author: Tatu Ylonen <ylo@cs.hut.fi>
4 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland 4 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -436,10 +436,15 @@ channel_close_fd(struct ssh *ssh, int *fdp)
436static void 436static void
437channel_close_fds(struct ssh *ssh, Channel *c) 437channel_close_fds(struct ssh *ssh, Channel *c)
438{ 438{
439 int sock = c->sock, rfd = c->rfd, wfd = c->wfd, efd = c->efd;
440
439 channel_close_fd(ssh, &c->sock); 441 channel_close_fd(ssh, &c->sock);
440 channel_close_fd(ssh, &c->rfd); 442 if (rfd != sock)
441 channel_close_fd(ssh, &c->wfd); 443 channel_close_fd(ssh, &c->rfd);
442 channel_close_fd(ssh, &c->efd); 444 if (wfd != sock && wfd != rfd)
445 channel_close_fd(ssh, &c->wfd);
446 if (efd != sock && efd != rfd && efd != wfd)
447 channel_close_fd(ssh, &c->efd);
443} 448}
444 449
445static void 450static void