The file descriptors for socket, stdin, stdout and stderr aren't
authortb <tb@openbsd.org>
Mon, 5 Feb 2018 05:36:49 +0000 (05:36 +0000)
committertb <tb@openbsd.org>
Mon, 5 Feb 2018 05:36:49 +0000 (05:36 +0000)
necessarily distinct, so check if they are the same to avoid closing
the same fd several times.

ok djm

usr.bin/ssh/channels.c

index f10702d..00d9f1c 100644 (file)
@@ -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
@@ -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