ash: return exit status of nofork applets (again)
authorRon Yorston <rmy@pobox.com>
Thu, 20 Feb 2020 08:23:03 +0000 (08:23 +0000)
committerDenys Vlasenko <vda.linux@googlemail.com>
Thu, 20 Feb 2020 09:39:46 +0000 (10:39 +0100)
Since commit d81af7216 (ash: eval: Reap zombies after built-in commands
and functions) if the shell is compiled with SH_STANDALONE and SH_NOFORK
enabled nofork applets potentially return the incorrect status.

The status value returned by evalcommand() in this case is obtained from
exitstatus in a call to waitforjob(NULL).  This overwrites the status
set for nonfork applets.

If this commit seems familiar it's essentially a reversion of commit
5ccb0e92fa (ash: return exit status of nofork applets).  What was correct
in 2016 is wrong in 2020 and vice versa.

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
shell/ash.c

index 6087416abfeeb4b395fa62bb2fc07342c5af52b8..a6f777800d1d9049b31c2385e09fafb4bbd18b9d 100644 (file)
@@ -10351,7 +10351,7 @@ evalcommand(union node *cmd, int flags)
                         * and/or wait for user input ineligible for NOFORK:
                         * for example, "yes" or "rm" (rm -i waits for input).
                         */
-                       status = run_nofork_applet(applet_no, argv);
+                       exitstatus = run_nofork_applet(applet_no, argv);
                        environ = sv_environ;
                        /*
                         * Try enabling NOFORK for "yes" applet.