commit 94d3af71b20ed43a3e8d283402ac3e2d7037fd55
Author: Dmitry Goncharov <dgoncharov@users.sf.net>
Date:   Sat Mar 5 19:35:57 2022 -0500

    [SV 62145] Remove a stdin temp file on re-exec failure.
    
    src/job.c (exec_command): do not call _exit (127) on execvp failure.
    (child_execute_job): call _exec (127) if exec_command returned.
    src/job.h (exec_command): return void.
    src/main.c (main): unlink a stdin temporary file on failure to re-execute.
    tests/run_make_tests.pl: Fix ERR_nonexe_file.
    tests/scripts/features/temp_stdin: Test that make unlinks the temp file.

diff --git a/tests/run_make_tests.pl b/tests/run_make_tests.pl
index f64ff8f0..33a13201 100644
--- a/tests/run_make_tests.pl
+++ b/tests/run_make_tests.pl
@@ -141,7 +141,7 @@ $ERR_command_not_found = undef;
       $ERR_read_only_file = "$!";
   }
 
-  $_ = `./file.out 2>/dev/null`;
+  $_ = `./file.out`;
   if ($? == 0) {
       print "Executed non-executable file!  Skipping related tests.\n";
   } else {
diff --git a/tests/scripts/features/temp_stdin b/tests/scripts/features/temp_stdin
new file mode 100644
index 00000000..f86415e9
--- /dev/null
+++ b/tests/scripts/features/temp_stdin
@@ -0,0 +1,99 @@
+#                                                              -*-mode: perl-*-
+$description = "Test removal of the stdin temporary file.";
+
+$details = "Make uses a temporary file to save code piped to stdin. This suite
+tests that make removes that file.";
+
+use File::Temp qw /tempdir/;
+
+sub check_tempfile
+{
+    my ($tdir) = @_;
+    my @left = glob $tdir . '/Gm*';
+    scalar @left == 0 && return;
+    my $answer = "temporary file $left[0] is left behind\n";
+    compare_output($answer, &get_logfile(1));
+}
+
+create_file('input.mk', "world:=1\n");
+create_file('bye.mk', "moon:=2\n");
+
+# sv 62118,62145.
+# Test that makes leaves no temp file when make code is piped to stdin and -v,
+# -h or an invalid option is specified.
+my @opts = ('-v', '-h', '--nosuchopt');
+my @exit_codes = (0, 0, 512);
+for my $i (0 .. $#opts) {
+    my $tdir = tempdir(CLEANUP => 1);
+    $ENV{'TMPDIR'} = $tdir;
+    close(STDIN);
+    open(STDIN, "<", 'input.mk') || die "$0: cannot open input.mk for reading: $!";
+    run_make_test(q!
+    all:; $(info hello world)
+    !, "$opts[$i] -f-", "/uilt for /", $exit_codes[$i]);
+    check_tempfile($tdir);
+}
+
+# sv 62118,62145.
+# Test that a stdin temp file is removed.
+my $tdir = tempdir(CLEANUP => 1);
+$ENV{'TMPDIR'} = $tdir;
+close(STDIN);
+open(STDIN, "<", 'input.mk') || die "$0: cannot open input.mk for reading: $!";
+run_make_test(q!
+all:; $(info world=$(world))
+!, '-f-', "world=1\n#MAKE#: 'all' is up to date.\n");
+check_tempfile($tdir);
+
+# sv 62118,62145.
+# Test that a stdin temp file is removed, even when make re-execs.
+# Also test that make nohors TMPDIR to create the temp file.
+my $tdir = tempdir(CLEANUP => 1);
+$ENV{'TMPDIR'} = $tdir;
+# Ensure touching bye.mk causes re-exec.
+&utouch(-600, 'bye.mk');
+close(STDIN);
+open(STDIN, "<", 'input.mk') || die "$0: cannot open input.mk for reading: $!";
+run_make_test(q!
+include bye.mk
+all:; $(info hello)
+$(MAKE_RESTARTS)bye.mk: force; touch $@
+force:
+!, '-R --debug=b -f-', "/Re-executing.+?--temp-stdin=$tdir/");
+check_tempfile($tdir);
+
+if ($port_type eq 'UNIX') {
+# sv 62118,62145.
+# Test that a stdin temp file is removed, when execvp fails to re-exec make.
+# In order to cause execvp to fail, copy the tested make binary to the temp
+# directory and take away the 'x' bit.
+use File::Copy;
+use Storable qw(dclone);
+
+my $tdir = tempdir(CLEANUP => 1);
+$ENV{'TMPDIR'} = $tdir;
+my $makecopy = $tdir . "/make";
+copy("$mkpath", $makecopy);
+# Set file mode bits, because perl copy won't.
+chmod 0750, $makecopy;
+my @saved_make_command = @{dclone \@make_command};
+@make_command = ($makecopy);
+# Ensure touching bye.mk causes re-exec.
+&utouch(-600, 'bye.mk');
+close(STDIN);
+open(STDIN, "<", 'input.mk') || die "$0: cannot open input.mk for reading: $!";
+run_make_test("
+include bye.mk
+all:; \$(info hello)
+\$(MAKE_RESTARTS)bye.mk: force; touch \$@ && chmod -x $makecopy
+force:
+", '-f-', "touch bye.mk && chmod -x $makecopy\nmake: $makecopy: $ERR_nonexe_file\n", 32512);
+check_tempfile($tdir);
+# Restore make_command, other tests use it.
+@make_command = @{dclone \@saved_make_command};
+}
+
+unlink ('input.mk', 'bye.mk');
+
+# This tells the test driver that the perl test script executed properly.
+1;
