To avoid overwriting existing command status, check for CMD_INVALID
instead of CMD_ERRNO or CMD_WSTATUS.
This commit is contained in:
@@ -193,7 +193,7 @@ mon_handle_sigchld(struct monitor_closure *mc)
|
||||
}
|
||||
|
||||
/* Don't overwrite execve() failure with child exit status. */
|
||||
if (mc->cstat->type != CMD_ERRNO) {
|
||||
if (mc->cstat->type == CMD_INVALID) {
|
||||
/*
|
||||
* Store wait status in cstat and forward to parent if stopped.
|
||||
*/
|
||||
|
@@ -550,7 +550,7 @@ handle_sigchld_nopty(struct exec_closure_nopty *ec)
|
||||
__func__, (int)ec->cmnd_pid, WEXITSTATUS(status));
|
||||
}
|
||||
/* Don't overwrite execve() failure with command exit status. */
|
||||
if (ec->cstat->type != CMD_ERRNO) {
|
||||
if (ec->cstat->type == CMD_INVALID) {
|
||||
ec->cstat->type = CMD_WSTATUS;
|
||||
ec->cstat->val = status;
|
||||
}
|
||||
|
@@ -734,7 +734,7 @@ backchannel_cb(int fd, int what, void *v)
|
||||
/* Nothing ready. */
|
||||
break;
|
||||
default:
|
||||
if (ec->cstat->val != CMD_WSTATUS) {
|
||||
if (ec->cstat->val == CMD_INVALID) {
|
||||
ec->cstat->type = CMD_ERRNO;
|
||||
ec->cstat->val = errno;
|
||||
sudo_debug_printf(SUDO_DEBUG_ERROR,
|
||||
@@ -795,7 +795,7 @@ backchannel_cb(int fd, int what, void *v)
|
||||
break;
|
||||
default:
|
||||
/* Short read, should not happen. */
|
||||
if (ec->cstat->val != CMD_WSTATUS) {
|
||||
if (ec->cstat->val == CMD_INVALID) {
|
||||
ec->cstat->type = CMD_ERRNO;
|
||||
ec->cstat->val = EIO;
|
||||
sudo_debug_printf(SUDO_DEBUG_ERROR,
|
||||
|
Reference in New Issue
Block a user