commit 1d3142da968da7f6f61f1c1708f39ca233eda150
Author:     Koichi Murase <[email protected]>
AuthorDate: Tue Aug 24 06:25:05 2021 +0900
Commit:     Hiltjo Posthuma <[email protected]>
CommitDate: Tue Aug 24 13:30:11 2021 +0200

    fix a problem that the standard streams are unexpectedly closed
    
    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.

diff --git a/st.c b/st.c
index ebdf360..a9338e1 100644
--- 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");

Reply via email to