commit 6d1a3bbbb870a303b47f790ba76146e61a4c7b6a
Author:     Jan Klemkow <[email protected]>
AuthorDate: Tue Apr 28 21:20:42 2020 +0200
Commit:     Jan Klemkow <[email protected]>
CommitDate: Tue Apr 28 21:20:42 2020 +0200

    avoid race condition with sigwinch
    
    if sigwinch comes before forking the child process,
    we are traped into an endless loop.  because, the
    variable child is zero.  Thus, we propagating sigwinch
    to ourself in the signal handler.

diff --git a/scroll.c b/scroll.c
index b42bd48..26b0527 100644
--- a/scroll.c
+++ b/scroll.c
@@ -428,9 +428,6 @@ main(int argc, char *argv[])
        if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) == -1)
                die("ioctl:");
 
-       if (signal(SIGWINCH, sigwinch) == SIG_ERR)
-               die("signal:");
-
        child = forkpty(&mfd, NULL, &dfl, &ws);
        if (child == -1)
                die("forkpty:");
@@ -457,6 +454,9 @@ main(int argc, char *argv[])
                die("pledge:");
 #endif
 
+       if (signal(SIGWINCH, sigwinch) == SIG_ERR)
+               die("signal:");
+
        struct termios new = dfl;
        cfmakeraw(&new);
        new.c_cc[VMIN ] = 1;    /* return read if at least one byte in buffer */

Reply via email to