[git commit] fsck: fix incorrect handling of child exit

Denys Vlasenko vda.linux at googlemail.com
Thu May 24 13:29:15 UTC 2018


commit: https://git.busybox.net/busybox/commit/?id=ccb8e4bc4fb74701d0d323d61e9359d8597a4272
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

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 at nh2.me>.

function                                             old     new   delta
wait_one                                             294     282     -12

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 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;
 }
 
 /*


More information about the busybox-cvs mailing list