]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lib:pager: fix signal safety issues
authorCristian Rodríguez <crrodriguez@opensuse.org>
Sun, 15 Jan 2023 01:33:14 +0000 (01:33 +0000)
committerCristian Rodríguez <crrodriguez@opensuse.org>
Sun, 15 Jan 2023 01:33:14 +0000 (01:33 +0000)
- Cannot use stdio in signal handlers, so you cannot safely call
  fflush.
- cannot call exit() but only _exit()

lib/pager.c

index e5bd07a4714fd013e8e6aadc8d2e6c74a25f9aae..8f62310c07797d97b7f8ac7598f94c327696fed1 100644 (file)
@@ -114,7 +114,9 @@ static int wait_or_whine(pid_t pid)
                if (waiting < 0) {
                        if (errno == EINTR)
                                continue;
-                       err(EXIT_FAILURE, _("waitpid failed (%s)"), strerror(errno));
+                       /* Can't err() on signal handler */
+                       ignore_result(write(STDERR_FILENO, "waitpid failed", 14));
+                       _exit(EXIT_FAILURE);
                }
                if (waiting != pid)
                        return -1;
@@ -163,8 +165,6 @@ static void wait_for_pager(void)
        if (pager_process.pid == 0)
                return;
 
-       fflush(stdout);
-       fflush(stderr);
        /* signal EOF to pager */
        close(STDOUT_FILENO);
        close(STDERR_FILENO);