- 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
90 lines
2.6 KiB
Diff
90 lines
2.6 KiB
Diff
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
|