From e147ba1fecd96e74b9357fe59e954575b3359235 Mon Sep 17 00:00:00 2001 From: "Todd C. Miller" Date: Wed, 31 Aug 2016 08:39:26 -0600 Subject: [PATCH] Use W_EXITCODE to construct the wait status if sudo could not execute the command. Fixes the sudo exit value for exec(3) failure. --- include/sudo_compat.h | 5 +++++ src/sudo.c | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/include/sudo_compat.h b/include/sudo_compat.h index ee65655a6..2e35131ce 100644 --- a/include/sudo_compat.h +++ b/include/sudo_compat.h @@ -284,6 +284,11 @@ extern int errno; # define WCOREDUMP(x) ((x) & 0x80) #endif +/* W_EXITCODE is not POSIX but the encoding of wait status is. */ +#ifndef W_EXITCODE +# define W_EXITCODE(ret, sig) ((ret) << 8 | (sig)) +#endif + /* Number of bits in a byte. */ #ifndef NBBY # ifdef __NBBY diff --git a/src/sudo.c b/src/sudo.c index e61aed2a4..8fd910f45 100644 --- a/src/sudo.c +++ b/src/sudo.c @@ -1130,13 +1130,14 @@ done: /* * Run the command and wait for it to complete. + * Returns wait status suitable for use with the wait(2) macros. */ int run_command(struct command_details *details) { struct plugin_container *plugin; struct command_status cstat; - int status = 1; + int status = W_EXITCODE(1, 0); debug_decl(run_command, SUDO_DEBUG_EXEC) cstat.type = CMD_INVALID; @@ -1155,7 +1156,6 @@ run_command(struct command_details *details) "calling I/O close with errno %d", cstat.val); iolog_close(plugin, 0, cstat.val); } - status = 1; break; case CMD_WSTATUS: /* Command ran, exited or was killed. */ -- 2.50.1