diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2018-05-24 15:26:28 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2018-05-24 15:29:15 +0200 |
commit | ccb8e4bc4fb74701d0d323d61e9359d8597a4272 (patch) | |
tree | ebab2c7ac66d99102978efa66045d33abfb16341 | |
parent | 8c24af9dcfe0d89a660c39838eec4d20bc13efbf (diff) | |
download | busybox-ccb8e4bc4fb74701d0d323d61e9359d8597a4272.tar.gz |
fsck: fix incorrect handling of child exit
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 <mail@nh2.me>.
function old new delta
wait_one 294 282 -12
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | e2fsprogs/fsck.c | 17 |
1 files 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; } /* |