From fa8878bf1fe331df752395cce90da212e25e07b7 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Mon, 29 Apr 2019 14:24:07 +0200 Subject: [PATCH] start-stop-daemon: do try to close fds > 2 sh -c 'exec 3>&1; exec start-stop-daemon -S -b -x /bin/sleep -- 123' now closes fd 3. function old new delta bb_daemonize_or_rexec 183 192 +9 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 1/0 up/down: 9/0) Total: 9 bytes Signed-off-by: Denys Vlasenko --- libbb/vfork_daemon_rexec.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/libbb/vfork_daemon_rexec.c b/libbb/vfork_daemon_rexec.c index 1aac27b36..65271e84f 100644 --- a/libbb/vfork_daemon_rexec.c +++ b/libbb/vfork_daemon_rexec.c @@ -263,12 +263,6 @@ void FAST_FUNC bb_daemonize_or_rexec(int flags, char **argv) if (flags & DAEMON_CHDIR_ROOT) xchdir("/"); - if (flags & DAEMON_DEVNULL_STDIO) { - close(0); - close(1); - close(2); - } - fd = open(bb_dev_null, O_RDWR); if (fd < 0) { /* NB: we can be called as bb_sanitize_stdio() from init @@ -278,8 +272,15 @@ void FAST_FUNC bb_daemonize_or_rexec(int flags, char **argv) fd = xopen("/", O_RDONLY); /* don't believe this can fail */ } - while ((unsigned)fd < 2) - fd = dup(fd); /* have 0,1,2 open at least to /dev/null */ + if (flags & DAEMON_DEVNULL_STDIO) { + xdup2(fd, 0); + xdup2(fd, 1); + xdup2(fd, 2); + } else { + /* have 0,1,2 open at least to /dev/null */ + while ((unsigned)fd < 2) + fd = dup(fd); + } if (!(flags & DAEMON_ONLY_SANITIZE)) {