]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
use same close logic for stderr as stdout
authorDamien Miller <djm@mindrot.org>
Fri, 8 Feb 2019 03:50:36 +0000 (14:50 +1100)
committerDamien Miller <djm@mindrot.org>
Fri, 8 Feb 2019 03:50:36 +0000 (14:50 +1100)
Avoids sending SIGPIPE to child processes after their parent exits
if they attempt to write to stderr.

Analysis and patch from JD Paul; patch reworked by Jakub Jelen and
myself. bz#2071; ok dtucker@

channels.c

index 19da16eb3706117ae006eb3093bd794e9c63d846..657381b8037d67aab96aab83521d11567fd898c7 100644 (file)
@@ -2100,16 +2100,18 @@ channel_handle_efd_read(struct ssh *ssh, Channel *c,
     fd_set *readset, fd_set *writeset)
 {
        char buf[CHAN_RBUF];
-       int r;
        ssize_t len;
+       int r, force;
+
+       force = c->isatty && c->detach_close && c->istate != CHAN_INPUT_CLOSED;
 
-       if (!c->detach_close && !FD_ISSET(c->efd, readset))
+       if (c->efd == -1 || (!force && !FD_ISSET(c->efd, readset)))
                return 1;
 
        len = read(c->efd, buf, sizeof(buf));
        debug2("channel %d: read %zd from efd %d", c->self, len, c->efd);
        if (len < 0 && (errno == EINTR || ((errno == EAGAIN ||
-           errno == EWOULDBLOCK) && !c->detach_close)))
+           errno == EWOULDBLOCK) && !force)))
                return 1;
        if (len <= 0) {
                debug2("channel %d: closing read-efd %d",