summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2009-07-24 18:22:13 +0200
committerLennart Poettering <lennart@poettering.net>2009-07-24 18:22:13 +0200
commitf6763917ee757845e2c52e36975d948bc93d8b6e (patch)
tree632d4cf052123d5cf334d60bb77b0f41f5f80f1b
parent5e24b6dff532ef82e028a78f020a826032493b2e (diff)
autospawn: refuse autospawning if process disabled waitpid()
-rw-r--r--src/pulse/context.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/pulse/context.c b/src/pulse/context.c
index 4ded5565..ab1c1638 100644
--- a/src/pulse/context.c
+++ b/src/pulse/context.c
@@ -668,11 +668,24 @@ static pa_strlist *prepend_per_user(pa_strlist *l) {
static int context_autospawn(pa_context *c) {
pid_t pid;
int status, r;
-
- pa_log_debug("Trying to autospawn...");
+ struct sigaction sa;
pa_context_ref(c);
+ if (sigaction(SIGCHLD, NULL, &sa) < 0) {
+ pa_log_debug("sigaction() failed: %s", pa_cstrerror(errno));
+ pa_context_fail(c, PA_ERR_INTERNAL);
+ goto fail;
+ }
+
+ if ((sa.sa_flags & SA_NOCLDWAIT) || sa.sa_handler == SIG_IGN) {
+ pa_log_debug("Process disabled waitpid(), cannot autospawn.");
+ pa_context_fail(c, PA_ERR_CONNECTIONREFUSED);
+ goto fail;
+ }
+
+ pa_log_debug("Trying to autospawn...");
+
if (c->spawn_api.prefork)
c->spawn_api.prefork();