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) static int wait_one(int flags)
{ {
int status; int status;
int sig; int exitcode;
struct fsck_instance *inst, *prev; struct fsck_instance *inst, *prev;
pid_t pid; pid_t pid;
@@ -448,15 +448,16 @@ static int wait_one(int flags)
} }
child_died: child_died:
status = WEXITSTATUS(status); exitcode = WEXITSTATUS(status);
if (WIFSIGNALED(status)) { if (WIFSIGNALED(status)) {
unsigned sig;
sig = WTERMSIG(status); sig = WTERMSIG(status);
status = EXIT_UNCORRECTED; exitcode = EXIT_UNCORRECTED;
if (sig != SIGINT) { if (sig != SIGINT) {
printf("Warning: %s %s terminated " printf("Warning: %s %s terminated "
"by signal %d\n", "by signal %u\n",
inst->prog, inst->device, sig); inst->prog, inst->device, sig);
status = EXIT_ERROR; exitcode = EXIT_ERROR;
} }
} }
@@ -492,12 +493,12 @@ static int wait_one(int flags)
else else
G.instance_list = inst->next; G.instance_list = inst->next;
if (G.verbose > 1) if (G.verbose > 1)
printf("Finished with %s (exit status %d)\n", printf("Finished with %s (exit status %u)\n",
inst->device, status); inst->device, exitcode);
G.num_running--; G.num_running--;
free_instance(inst); free_instance(inst);
return status; return exitcode;
} }
/* /*