]> Sergey Matveev's repositories - st.git/commitdiff
fix a problem that the standard streams are unexpectedly closed
authorKoichi Murase <myoga.murase@gmail.com>
Mon, 23 Aug 2021 21:25:05 +0000 (06:25 +0900)
committerHiltjo Posthuma <hiltjo@codemadness.org>
Tue, 24 Aug 2021 11:30:11 +0000 (13:30 +0200)
In the current implementation, the slave PTY (assigned to the variable
`s') is always closed after duplicating it to file descriptors of
standard streams (0, 1, and 2).  However, when the allocated slave PTY
`s' is already one of 0, 1, or 2, this causes unexpected closing of a
standard stream.  The same problem occurs when the file descriptor of
the master PTY (the variable `m') is one of 0, 1, or 2.

In this patch, the original master PTY (m) is closed before it would
be overwritten by duplicated slave PTYs.  The original slave PTY (s)
is closed only when it is not one of the stanrad streams.

st.c

diff --git a/st.c b/st.c
index ebdf3609b6a8eb6605791a91894868175b0ecc86..a9338e1a5771762cd0e53fb2f215dccd3378737e 100644 (file)
--- a/st.c
+++ b/st.c
@@ -793,14 +793,15 @@ ttynew(const char *line, char *cmd, const char *out, char **args)
                break;
        case 0:
                close(iofd);
+               close(m);
                setsid(); /* create a new process group */
                dup2(s, 0);
                dup2(s, 1);
                dup2(s, 2);
                if (ioctl(s, TIOCSCTTY, NULL) < 0)
                        die("ioctl TIOCSCTTY failed: %s\n", strerror(errno));
-               close(s);
-               close(m);
+               if (s > 2)
+                       close(s);
 #ifdef __OpenBSD__
                if (pledge("stdio getpw proc exec", NULL) == -1)
                        die("pledge\n");