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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Reference in New Issue
Block a user