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 standarad streams. Ref. https://git.suckless.org/st/commit/1d3142da968da7f6f61f1c1708f39ca233eda150.html
This commit is contained in:
parent
f0e4dc3bd5
commit
78adbd2406
3
st.c
3
st.c
|
@ -1073,6 +1073,7 @@ ttynew(const char *line, char *cmd, const char *out, char **args)
|
||||||
break;
|
break;
|
||||||
case 0:
|
case 0:
|
||||||
close(iofd);
|
close(iofd);
|
||||||
|
close(m);
|
||||||
setsid(); /* create a new process group */
|
setsid(); /* create a new process group */
|
||||||
dup2(s, 0);
|
dup2(s, 0);
|
||||||
dup2(s, 1);
|
dup2(s, 1);
|
||||||
|
@ -1081,6 +1082,8 @@ ttynew(const char *line, char *cmd, const char *out, char **args)
|
||||||
die("ioctl TIOCSCTTY failed: %s\n", strerror(errno));
|
die("ioctl TIOCSCTTY failed: %s\n", strerror(errno));
|
||||||
close(s);
|
close(s);
|
||||||
close(m);
|
close(m);
|
||||||
|
if (s > 2)
|
||||||
|
close(s);
|
||||||
#ifdef __OpenBSD__
|
#ifdef __OpenBSD__
|
||||||
if (pledge("stdio getpw proc exec", NULL) == -1)
|
if (pledge("stdio getpw proc exec", NULL) == -1)
|
||||||
die("pledge\n");
|
die("pledge\n");
|
||||||
|
|
Loading…
Reference in New Issue