From b96bd0d40efe26426294a135b7e9b66531f4f67a Mon Sep 17 00:00:00 2001 From: tb Date: Mon, 5 Feb 2018 05:36:49 +0000 Subject: [PATCH] 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 --- usr.bin/ssh/channels.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/usr.bin/ssh/channels.c b/usr.bin/ssh/channels.c index f10702daca4..00d9f1c5579 100644 --- a/usr.bin/ssh/channels.c +++ b/usr.bin/ssh/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 * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -426,10 +426,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 -- 2.20.1