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);

Reply via email to