[PATCH] channels.c - check for same rfd/wfd/efd when setting the fds to nonblocking
Markus Schmidt
markus at blueflash.cc
Sat Apr 27 00:19:50 AEST 2019
In channels.c, the function channel_register_fds is called with three
fds (efd, wfd, rfd), which can be the same fd.
At the beginning of the function, when calling
fcntl(xxx, F_SETFD, FD_CLOEXEC);
there is a check that the function isn't called twice if some of the
same fds are the same (e.g. when rfd and wfd are identical).
Further down, another function is called on the fds:
set_nonblock(xxx);
There the check isn't performed. This is bascially inconsequential,
because set_nonblock() checks if the fd is already set as nonblocking,
but for code clarity I would suggest the following patch (it's attached
as well):
diff --git a/channels.c b/channels.c
index 0a32cb2..152a1fd 100644
--- a/channels.c
+++ b/channels.c
@@ -336,9 +336,9 @@ channel_register_fds(struct ssh *ssh, Channel *c,
int rfd, int wfd, int efd,
if (nonblock) {
if (rfd != -1)
set_nonblock(rfd);
- if (wfd != -1)
+ if (wfd != -1 && wfd != rfd)
set_nonblock(wfd);
- if (efd != -1)
+ if (efd != -1 && efd != rfd && efd != wfd)
set_nonblock(efd);
}
}
-------------- next part --------------
diff --git a/channels.c b/channels.c
index 0a32cb2..152a1fd 100644
--- a/channels.c
+++ b/channels.c
@@ -336,9 +336,9 @@ channel_register_fds(struct ssh *ssh, Channel *c, int rfd, int wfd, int efd,
if (nonblock) {
if (rfd != -1)
set_nonblock(rfd);
- if (wfd != -1)
+ if (wfd != -1 && wfd != rfd)
set_nonblock(wfd);
- if (efd != -1)
+ if (efd != -1 && efd != rfd && efd != wfd)
set_nonblock(efd);
}
}
More information about the openssh-unix-dev
mailing list