This patch will return the exit code from the called process which has not been done before. This made it more difficult to catch any unsuccessful calls from the web UI.
Partly Fixes: #12863 Tested-by: Jon Murphy jon.murphy@ipfire.org Signed-off-by: Michael Tremer michael.tremer@ipfire.org --- src/misc-progs/setuid.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-)
diff --git a/src/misc-progs/setuid.c b/src/misc-progs/setuid.c index 17b0e7066..9dc0a767b 100644 --- a/src/misc-progs/setuid.c +++ b/src/misc-progs/setuid.c @@ -104,16 +104,20 @@ static int system_core(char* command, char** args, uid_t uid, gid_t gid, char *e }
default: /* parent */ - do { - if (waitpid(pid, &status, 0) == -1) { - if (errno != EINTR) - return -1; - } else { - return status; - } - } while (1); - } + // Wait until the child process has finished + waitpid(pid, &status, 0); + + // The child was terminated by a signal + if (WIFSIGNALED(status)) + return 128 + WTERMSIG(status);
+ // Return the exit code if available + if (WIFEXITED(status)) + return WEXITSTATUS(status); + + // Something unexpected happened, exiting with error + return EXIT_FAILURE; + } }
int run(char* command, char** argv) {