From 88ec4a55cb42696ed29e7e23492a526fae875b77 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 30 May 2021 09:32:43 +0200 Subject: [PATCH] Call setsid() before redirecting stdio or unblocking signals We must detach from the controlling TTY before enabling signals and setting up new stdio. TTYs have their own handling of stdio. Signed-off-by: Joachim Wiberg --- src/service.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/service.c b/src/service.c index f6b6bf2a..53abb4bd 100644 --- a/src/service.c +++ b/src/service.c @@ -564,10 +564,6 @@ static int service_start(svc_t *svc) } args[i] = NULL; - if (!svc_is_tty(svc)) - redirect(svc); - sig_unblock(); - /* * The setsid() call takes care to detach the process * from its controlling terminal, preventing daemons @@ -579,7 +575,13 @@ static int service_start(svc_t *svc) * to the console at boot, for debugging or similar, * have a look at redirect() and log.console instead. */ - setsid(); + pid = setsid(); + if (pid < 1) + logit(LOG_ERR, "failed setsid(), pid %d: %s", pid, strerror(errno)); + + if (!svc_is_tty(svc)) + redirect(svc); + sig_unblock(); if (svc_is_runtask(svc)) status = exec_runtask(args[0], &args[1]); @@ -744,6 +746,7 @@ static int service_stop(svc_t *svc) pid = fork(); switch (pid) { case 0: + setsid(); redirect(svc); exec_runtask(svc->cmd, args); _exit(0);