summaryrefslogtreecommitdiffhomepage
path: root/libbb
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2019-04-29 14:24:07 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2019-04-29 14:24:07 +0200
commitfa8878bf1fe331df752395cce90da212e25e07b7 (patch)
treee2312f8e46bfcb96ef1d1bd758216fe8afcbd98b /libbb
parent13f42045616320119bb47cf8df302cfcc76ade9a (diff)
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 <vda.linux@googlemail.com>
Diffstat (limited to 'libbb')
-rw-r--r--libbb/vfork_daemon_rexec.c17
1 files 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)) {