From 9939d98454db32635dd9d0887ac930d7a24440bc Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Thu, 5 Apr 2018 09:21:39 -0400 Subject: [PATCH] Error handling in swaylock daemonize() Fixes #1741 --- swaylock/main.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/swaylock/main.c b/swaylock/main.c index 1d522184..4c6b44c6 100644 --- a/swaylock/main.c +++ b/swaylock/main.c @@ -23,12 +23,34 @@ #include "wlr-layer-shell-unstable-v1-client-protocol.h" static void daemonize() { + int fds[2]; + if (pipe(fds) != 0) { + wlr_log(L_ERROR, "Failed to pipe"); + exit(1); + } if (fork() == 0) { + close(fds[0]); int devnull = open("/dev/null", O_RDWR); dup2(STDOUT_FILENO, devnull); dup2(STDERR_FILENO, devnull); - chdir("/"); + uint8_t success = 0; + if (chdir("/") != 0) { + write(fds[1], &success, 1); + exit(1); + } + success = 1; + if (write(fds[1], &success, 1) != 1) { + exit(1); + } + close(fds[1]); } else { + close(fds[1]); + uint8_t success; + if (read(fds[0], &success, 1) != 1 || !success) { + wlr_log(L_ERROR, "Failed to daemonize"); + exit(1); + } + close(fds[0]); exit(0); } }