diff options
author | Paul Smith <psmith@gnu.org> | 2022-10-15 16:34:54 -0400 |
---|---|---|
committer | Paul Smith <psmith@gnu.org> | 2022-10-15 18:39:32 -0400 |
commit | 18c4b508ef24596470b64ddf058c0115ac75fbc2 (patch) | |
tree | 70410cfe71c32ac0235089e24fe02fa970bcef49 /tests | |
parent | 383eb3a923b95ee9959446a03e34d870f9d1f427 (diff) | |
download | make-git-18c4b508ef24596470b64ddf058c0115ac75fbc2.tar.gz |
[SV 63157] Ensure temporary files are removed when signaled
Original patch from Dmitry Goncharov <dgoncharov@users.sf.net>.
When handling a fatal signal ensure the temporary files for
stdin and the jobserver fifo (if in use) are deleted.
* src/makeint.h (temp_stdin_unlink): Declare a new method.
* src/main.c (temp_stdin_unlink): Delete the stdin temporary file
if it exists. If the unlink fails and we're not handling a signal
then show an error.
(main): Call temp_stdin_unlink() instead of unlinking by hand.
* src/commands.c (fatal_error_signal): Invoke cleanup methods if
we're handling a fatal signal.
* tests/scripts/features/output-sync: Test signal handling during
output sync and jobserver with FIFO.
* tests/scripts/features/temp_stdin: Test signal handling when
makefiles are read from stdin.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/scripts/features/output-sync | 23 | ||||
-rw-r--r-- | tests/scripts/features/temp_stdin | 29 |
2 files changed, 52 insertions, 0 deletions
diff --git a/tests/scripts/features/output-sync b/tests/scripts/features/output-sync index 1d09174f..292ef8ff 100644 --- a/tests/scripts/features/output-sync +++ b/tests/scripts/features/output-sync @@ -338,5 +338,28 @@ all:: ; @./foo bar baz '-O', "#MAKE#: ./foo: $ERR_no_such_file\n#MAKE#: *** [#MAKEFILE#:2: all] Error 127\n", 512); } +if ($port_type eq 'UNIX') { +# POSIX doesn't require sh to set PPID so test this +my $cmd = create_command(); +add_options($cmd, '-f', '/dev/null', '-E', q!all:;@echo $$PPID!); +my $fout = 'ppidtest.out'; +run_command_with_output($fout, @$cmd); +$_ = read_file_into_string($fout); +chomp($_); +if (/^[0-9]+$/) { +use POSIX (); +# SV 63157. +# Test that make removes temporary files, even when a signal is received. +# The general test_driver postprocessing will ensure the temporary file used +# to synchronize output and the jobserver fifo are both removed. +run_make_test(q! +pid:=$(shell echo $$PPID) +all:; @kill -TERM $(pid) +!, '-O -j2', "", POSIX::SIGTERM); +} + +unlink($fout); +} + # This tells the test driver that the perl test script executed properly. 1; diff --git a/tests/scripts/features/temp_stdin b/tests/scripts/features/temp_stdin index 8c7a47a0..32a68731 100644 --- a/tests/scripts/features/temp_stdin +++ b/tests/scripts/features/temp_stdin @@ -46,6 +46,35 @@ force: '-R --debug=b -f-', "/Re-executing.+?--temp-stdin=\Q$temppath\E/"); if ($port_type eq 'UNIX') { +# POSIX doesn't require sh to set PPID so test this +my $cmd = create_command(); +add_options($cmd, '-f', '/dev/null', '-E', q!all:;@echo $$PPID!); +my $fout = 'ppidtest.out'; +run_command_with_output($fout, @$cmd); +$_ = read_file_into_string($fout); +chomp($_); +if (/^[0-9]+$/) { +use POSIX (); + +# sv 63157. +# Test that make removes the temporary file which holds make code from stdin, +# even when a signal is received. +# include bye.mk and bye.mk: rule is needed to cause make to keep the temporary +# file for re-exec. Without re-exec make will remove the file before the signal +# arrives. +&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 +pid:=$(shell echo $$PPID) +all:; +bye.mk: force; @kill -TERM $(pid) +force: +!, '-f-', "", POSIX::SIGTERM); +} +unlink($fout); + # 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 |