67 lines
2.1 KiB
Diff
67 lines
2.1 KiB
Diff
From 1dedb74a2e1d840b531b76b01a76979f3b57456b Mon Sep 17 00:00:00 2001
|
|
From: Lennart Poettering <lennart@poettering.net>
|
|
Date: Tue, 26 Aug 2014 21:04:21 +0200
|
|
Subject: [PATCH] util: reset signals when we fork off agents
|
|
|
|
If we invoke agents, we should make sure we actually can kill them
|
|
again. I mean, it's probably not our job to cleanup the signals if our
|
|
tools are invoked in weird contexts, but at least we should make sure,
|
|
that the subprocesses we invoke and intend to control work as intended.
|
|
|
|
Also see:
|
|
|
|
http://lists.freedesktop.org/archives/systemd-devel/2014-August/022460.html
|
|
---
|
|
src/shared/util.c | 18 ++++++++++++++++++
|
|
src/shared/util.h | 1 +
|
|
2 files changed, 19 insertions(+)
|
|
|
|
diff --git a/src/shared/util.c b/src/shared/util.c
|
|
index 4af2d3ceba..98c07163da 100644
|
|
--- a/src/shared/util.c
|
|
+++ b/src/shared/util.c
|
|
@@ -959,6 +959,18 @@ int reset_all_signal_handlers(void) {
|
|
return r;
|
|
}
|
|
|
|
+int reset_signal_mask(void) {
|
|
+ sigset_t ss;
|
|
+
|
|
+ if (sigemptyset(&ss) < 0)
|
|
+ return -errno;
|
|
+
|
|
+ if (sigprocmask(SIG_SETMASK, &ss, NULL) < 0)
|
|
+ return -errno;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
char *strstrip(char *s) {
|
|
char *e;
|
|
|
|
@@ -5131,6 +5143,12 @@ int fork_agent(pid_t *pid, const int except[], unsigned n_except, const char *pa
|
|
/* Don't leak fds to the agent */
|
|
close_all_fds(except, n_except);
|
|
|
|
+ /* Make sure we actually can kill the agent, if we need to, in
|
|
+ * case somebody invoked us from a shell script that trapped
|
|
+ * SIGTERM or so... */
|
|
+ reset_all_signal_handlers();
|
|
+ reset_signal_mask();
|
|
+
|
|
stdout_is_tty = isatty(STDOUT_FILENO);
|
|
stderr_is_tty = isatty(STDERR_FILENO);
|
|
|
|
diff --git a/src/shared/util.h b/src/shared/util.h
|
|
index cd947dbbef..ea87c96956 100644
|
|
--- a/src/shared/util.h
|
|
+++ b/src/shared/util.h
|
|
@@ -274,6 +274,7 @@ int readlink_and_make_absolute(const char *p, char **r);
|
|
int readlink_and_canonicalize(const char *p, char **r);
|
|
|
|
int reset_all_signal_handlers(void);
|
|
+int reset_signal_mask(void);
|
|
|
|
char *strstrip(char *s);
|
|
char *delete_chars(char *s, const char *bad);
|