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>
This commit is contained in:
Denys Vlasenko 2018-05-24 15:26:28 +02:00
parent 8c24af9dcf
commit ccb8e4bc4f

View File

@ -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;
}
/*