From 7701718d7bd412c52b56117398bc6bfdfaff49f6 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sat, 30 Mar 2024 12:01:03 +0100 Subject: [PATCH] Fix #400: resolve exit code from pclose() by calling WEXITSTATUS() This problem affects all calls to run_interactive() that check the return value of the command. Causing HOOK_MOUNT_ERROR to *not* run on mount failure, and sulogin() to *not* be started on fsck error. Signed-off-by: Joachim Wiberg --- src/exec.c | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/src/exec.c b/src/exec.c index 8ab7fb09..cbfd6ee3 100644 --- a/src/exec.c +++ b/src/exec.c @@ -138,31 +138,32 @@ int run(char *cmd, char *log) pid = fork(); if (0 == pid) { - int rc = EX_OSERR; + char *pfx = *log ? ": " : ""; + char buf[256]; + FILE *pp; + int rc; setsid(); sig_unblock(); if (!log) { do_redirect(); execvp(args[0], args); - } else { - char *pfx = *log ? ": " : ""; - FILE *pp; - - pp = popen(cmd, "r"); - if (pp) { - char buf[256]; - - while (fgets(buf, sizeof(buf), pp)) { - chomp(buf); - logit(LOG_NOTICE, "%s%s%s", log, pfx, buf); - } - - rc = pclose(pp); - } + _exit(EX_OSERR); } - _exit(rc); + pp = popen(cmd, "r"); + if (!pp) + _exit(EX_OSERR); + + while (fgets(buf, sizeof(buf), pp)) { + chomp(buf); + logit(LOG_NOTICE, "%s%s%s", log, pfx, buf); + } + + rc = pclose(pp); + if (rc == -1) + _exit(EX_OSERR); + _exit(WEXITSTATUS(rc)); } else if (-1 == pid) { err(1, "%s", !log ? args[0] : cmd); if (backup)