From: tb Date: Mon, 5 Feb 2018 05:36:49 +0000 (+0000) Subject: The file descriptors for socket, stdin, stdout and stderr aren't X-Git-Url: http://artulab.com/gitweb/?a=commitdiff_plain;h=b96bd0d40efe26426294a135b7e9b66531f4f67a;p=openbsd 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 --- 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