Program: script(1)
Issue description: Currently, script(1) passes &tt and &win to openpty
even when isatty(0) == 0. Also, the SIGWINCH handler does not check if
stdin is a tty.
The patch follows [ also attached ].
Signed-off-by: Soumendra Ganguly <[email protected]>
---
--- src/usr.bin/script/script.c 2020-08-03 21:33:44.636187087 -0500
+++ script.c 2020-08-04 01:03:15.925066340 -0500
@@ -74,18 +74,18 @@
#include <util.h>
#include <err.h>
-FILE *fscript;
-int master, slave;
+static FILE *fscript;
+static int master, slave;
volatile sig_atomic_t child;
-pid_t subchild;
-char *fname;
+static pid_t subchild;
+static char *fname;
volatile sig_atomic_t dead;
volatile sig_atomic_t sigdeadstatus;
volatile sig_atomic_t flush;
-struct termios tt;
-int istty;
+static int istty;
+static struct termios tt;
__dead void done(int);
void dooutput(void);
@@ -132,13 +132,18 @@
if ((fscript = fopen(fname, aflg ? "a" : "w")) == NULL)
err(1, "%s", fname);
- if (isatty(0)) {
- if (tcgetattr(STDIN_FILENO, &tt) == 0 &&
- ioctl(STDIN_FILENO, TIOCGWINSZ, &win) == 0)
- istty = 1;
+ istty = isatty(STDIN_FILENO);
+ if (istty) {
+ if (tcgetattr(STDIN_FILENO, &tt) == -1)
+ err(1, "tcgetattr");
+ if (ioctl(STDIN_FILENO, TIOCGWINSZ, &win) == -1)
+ err(1, "ioctl");
+ if (openpty(&master, &slave, NULL, &tt, &win) == -1)
+ err(1, "openpty");
+ } else {
+ if (openpty(&master, &slave, NULL, NULL, NULL) == -1)
+ err(1, "openpty");
}
- if (openpty(&master, &slave, NULL, &tt, &win) == -1)
- err(1, "openpty");
(void)printf("Script started, output file is %s\n", fname);
if (istty) {
@@ -227,7 +232,7 @@
struct winsize win;
pid_t pgrp;
- if (ioctl(STDIN_FILENO, TIOCGWINSZ, &win) != -1) {
+ if (istty && ioctl(STDIN_FILENO, TIOCGWINSZ, &win) != -1) {
ioctl(slave, TIOCSWINSZ, &win);
if (ioctl(slave, TIOCGPGRP, &pgrp) != -1)
killpg(pgrp, SIGWINCH);
--- src/usr.bin/script/script.c 2020-08-03 21:33:44.636187087 -0500
+++ script.c 2020-08-04 01:03:15.925066340 -0500
@@ -74,18 +74,18 @@
#include <util.h>
#include <err.h>
-FILE *fscript;
-int master, slave;
+static FILE *fscript;
+static int master, slave;
volatile sig_atomic_t child;
-pid_t subchild;
-char *fname;
+static pid_t subchild;
+static char *fname;
volatile sig_atomic_t dead;
volatile sig_atomic_t sigdeadstatus;
volatile sig_atomic_t flush;
-struct termios tt;
-int istty;
+static int istty;
+static struct termios tt;
__dead void done(int);
void dooutput(void);
@@ -132,13 +132,18 @@
if ((fscript = fopen(fname, aflg ? "a" : "w")) == NULL)
err(1, "%s", fname);
- if (isatty(0)) {
- if (tcgetattr(STDIN_FILENO, &tt) == 0 &&
- ioctl(STDIN_FILENO, TIOCGWINSZ, &win) == 0)
- istty = 1;
+ istty = isatty(STDIN_FILENO);
+ if (istty) {
+ if (tcgetattr(STDIN_FILENO, &tt) == -1)
+ err(1, "tcgetattr");
+ if (ioctl(STDIN_FILENO, TIOCGWINSZ, &win) == -1)
+ err(1, "ioctl");
+ if (openpty(&master, &slave, NULL, &tt, &win) == -1)
+ err(1, "openpty");
+ } else {
+ if (openpty(&master, &slave, NULL, NULL, NULL) == -1)
+ err(1, "openpty");
}
- if (openpty(&master, &slave, NULL, &tt, &win) == -1)
- err(1, "openpty");
(void)printf("Script started, output file is %s\n", fname);
if (istty) {
@@ -227,7 +232,7 @@
struct winsize win;
pid_t pgrp;
- if (ioctl(STDIN_FILENO, TIOCGWINSZ, &win) != -1) {
+ if (istty && ioctl(STDIN_FILENO, TIOCGWINSZ, &win) != -1) {
ioctl(slave, TIOCSWINSZ, &win);
if (ioctl(slave, TIOCGPGRP, &pgrp) != -1)
killpg(pgrp, SIGWINCH);