From ccb8e4bc4fb74701d0d323d61e9359d8597a4272 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Thu, 24 May 2018 15:26:28 +0200 Subject: [PATCH] fsck: fix incorrect handling of child exit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In commit c4fb8c6a - fsck: do not use statics not only statics were changed but also a couple of statics-unrelated changes were made. This included the handling of the child termination status as follows: - if (WIFEXITED(status)) - status = WEXITSTATUS(status); - else if (WIFSIGNALED(status)) { + status = WEXITSTATUS(status); + if (WIFSIGNALED(status)) { This is wrong, should have used a different variable to hold exit code. Reported by Niklas Hambüchen . function old new delta wait_one 294 282 -12 Signed-off-by: Denys Vlasenko --- e2fsprogs/fsck.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/e2fsprogs/fsck.c b/e2fsprogs/fsck.c index 1c285bb92..f5aa3dbe4 100644 --- a/e2fsprogs/fsck.c +++ b/e2fsprogs/fsck.c @@ -414,7 +414,7 @@ static void kill_all_if_got_signal(void) static int wait_one(int flags) { int status; - int sig; + int exitcode; struct fsck_instance *inst, *prev; pid_t pid; @@ -448,15 +448,16 @@ static int wait_one(int flags) } child_died: - status = WEXITSTATUS(status); + exitcode = WEXITSTATUS(status); if (WIFSIGNALED(status)) { + unsigned sig; sig = WTERMSIG(status); - status = EXIT_UNCORRECTED; + exitcode = EXIT_UNCORRECTED; if (sig != SIGINT) { printf("Warning: %s %s terminated " - "by signal %d\n", + "by signal %u\n", inst->prog, inst->device, sig); - status = EXIT_ERROR; + exitcode = EXIT_ERROR; } } @@ -492,12 +493,12 @@ static int wait_one(int flags) else G.instance_list = inst->next; if (G.verbose > 1) - printf("Finished with %s (exit status %d)\n", - inst->device, status); + printf("Finished with %s (exit status %u)\n", + inst->device, exitcode); G.num_running--; free_instance(inst); - return status; + return exitcode; } /*