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 <troglobit@gmail.com>
This commit is contained in:
Joachim Wiberg
2024-03-30 12:38:50 +01:00
parent eb4eca9607
commit 7701718d7b
+18 -17
View File
@@ -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)