File reset-sigpipe.patch of Package make

From 8a9e8592c9893385b5c4dd529f39333c7d7efab1 Mon Sep 17 00:00:00 2001
From: Andreas Schwab <schwab@suse.de>
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
openSUSE Build Service is sponsored by