From 7eeeb3a310705d80b3e4007a69630a5afaf4b4d43093b72d4ff36fbdc1a4f102 Mon Sep 17 00:00:00 2001 From: Andreas Schwab Date: Wed, 2 Nov 2022 16:31:19 +0000 Subject: [PATCH] Accepting request 1032929 from home:Andreas_Schwab:Factory - reset-sigpipe.patch: Reset SIGPIPE in children OBS-URL: https://build.opensuse.org/request/show/1032929 OBS-URL: https://build.opensuse.org/package/show/Base:System/make?expand=0&rev=79 --- make.changes | 5 +++ make.spec | 2 + reset-sigpipe.patch | 89 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+) create mode 100644 reset-sigpipe.patch diff --git a/make.changes b/make.changes index 85fa9c4..d096f37 100644 --- a/make.changes +++ b/make.changes @@ -1,3 +1,8 @@ +------------------------------------------------------------------- +Wed Nov 2 15:39:46 UTC 2022 - Andreas Schwab + +- reset-sigpipe.patch: Reset SIGPIPE in children + ------------------------------------------------------------------- Mon Oct 31 13:31:57 UTC 2022 - Andreas Schwab diff --git a/make.spec b/make.spec index 956a4e4..059d48f 100644 --- a/make.spec +++ b/make.spec @@ -27,6 +27,7 @@ Source: https://ftp.gnu.org/gnu/make/make-%{version}.tar.gz Source1: https://ftp.gnu.org/gnu/make/make-%{version}.tar.gz.sig # keyring downloaded from https://savannah.gnu.org/project/memberlist-gpgkeys.php?group=make&download=1 Source2: %{name}.keyring +Patch: reset-sigpipe.patch Patch64: make-library-search-path.diff BuildRequires: pkgconfig Requires(post): %{install_info_prereq} @@ -40,6 +41,7 @@ The GNU make command with extensive documentation. %prep %setup -q +%patch -p1 if [ %{_lib} = lib64 ]; then %patch64 -p1 fi diff --git a/reset-sigpipe.patch b/reset-sigpipe.patch new file mode 100644 index 0000000..20409cc --- /dev/null +++ b/reset-sigpipe.patch @@ -0,0 +1,89 @@ +From 8a9e8592c9893385b5c4dd529f39333c7d7efab1 Mon Sep 17 00:00:00 2001 +From: Andreas Schwab +Date: Wed, 2 Nov 2022 15:50:52 +0100 +Subject: [PATCH] [SV 63307] Reset SIGPIPE in spawned children + +* configure.ac: Check for posix_spawnattr_setsigdefault. +* src/job.c (child_execute_job): Reset SIGPIPE in the child +process. +* src/job.h (sigpipe_ignored): Declare. +* src/main.c (main): Remember if SIGPIPE was inherited as ignored. +--- + configure.ac | 2 +- + src/job.c | 24 ++++++++++++++++++++++++ + src/job.h | 2 ++ + src/main.c | 2 +- + 4 files changed, 28 insertions(+), 2 deletions(-) + +Index: make-4.4/src/job.c +=================================================================== +--- make-4.4.orig/src/job.c ++++ make-4.4/src/job.c +@@ -261,6 +261,10 @@ unsigned long job_counter = 0; + /* Number of jobserver tokens this instance is currently using. */ + + unsigned int jobserver_tokens = 0; ++ ++/* Whether SIGPIPE was ignored on entry. */ ++ ++int sigpipe_ignored; + + + #ifdef WINDOWS32 +@@ -2305,6 +2309,12 @@ child_execute_job (struct childbase *chi + /* We are the child. */ + unblock_all_sigs (); + ++ /* Unignore SIPIPE. */ ++#ifdef SIGPIPE ++ if (!sigpipe_ignored) ++ bsd_signal (SIGPIPE, SIG_DFL); ++#endif ++ + #ifdef SET_STACK_SIZE + /* Reset limits, if necessary. */ + if (stack_limit.rlim_cur) +@@ -2347,6 +2357,18 @@ child_execute_job (struct childbase *chi + } + #endif /* have posix_spawnattr_setsigmask() */ + ++ /* Unignore SIGPIPE. */ ++ if (!sigpipe_ignored) ++ { ++ sigset_t mask; ++ sigemptyset (&mask); ++ sigaddset (&mask, SIGPIPE); ++ r = posix_spawnattr_setsigdefault (&attr, &mask); ++ if (r != 0) ++ goto cleanup; ++ flags |= POSIX_SPAWN_SETSIGDEF; ++ } ++ + /* USEVFORK can give significant speedup on systems where it's available. */ + #ifdef POSIX_SPAWN_USEVFORK + flags |= POSIX_SPAWN_USEVFORK; +Index: make-4.4/src/job.h +=================================================================== +--- make-4.4.orig/src/job.h ++++ make-4.4/src/job.h +@@ -88,5 +88,7 @@ pid_t exec_command (char **argv, char ** + + void unblock_all_sigs (void); + ++extern int sigpipe_ignored; ++ + extern unsigned int job_slots_used; + extern unsigned int jobserver_tokens; +Index: make-4.4/src/main.c +=================================================================== +--- make-4.4.orig/src/main.c ++++ make-4.4/src/main.c +@@ -1184,7 +1184,7 @@ main (int argc, char **argv, char **envp + + /* Don't die if our stdout sends us SIGPIPE. */ + #ifdef SIGPIPE +- bsd_signal (SIGPIPE, SIG_IGN); ++ sigpipe_ignored = bsd_signal (SIGPIPE, SIG_IGN) == SIG_IGN; + #endif + + #ifdef HAVE_ATEXIT