Index: tftpd.c =================================================================== RCS file: /cvs/src/usr.sbin/tftpd/tftpd.c,v retrieving revision 1.34 diff -u -p -r1.34 tftpd.c --- tftpd.c 14 Dec 2015 16:34:55 -0000 1.34 +++ tftpd.c 25 Mar 2016 00:15:05 -0000 @@ -82,6 +82,7 @@ #include #include #include +#include #include #include @@ -285,6 +286,7 @@ main(int argc, char *argv[]) char *addr = NULL; char *port = "tftp"; int family = AF_UNSPEC; + int devnull = -1; while ((c = getopt(argc, argv, "46cdl:p:r:v")) != -1) { switch (c) { @@ -337,6 +339,10 @@ main(int argc, char *argv[]) openlog(__progname, LOG_PID|LOG_NDELAY, LOG_DAEMON); tzset(); logger = &syslogger; + + devnull = open(_PATH_DEVNULL, O_RDWR, 0); + if (devnull == -1) + err(1, "open %s", _PATH_DEVNULL); } if (rewrite != NULL) @@ -344,9 +350,6 @@ main(int argc, char *argv[]) tftpd_listen(addr, port, family); - if (!debug && daemon(1, 0) == -1) - err(1, "unable to daemonize"); - if (chroot(dir)) err(1, "chroot %s", dir); if (chdir("/")) @@ -358,8 +361,27 @@ main(int argc, char *argv[]) setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid)) errx(1, "can't drop privileges"); + if (!debug) { + switch (fork()) { + case -1: + err(1, "fork"); + case 0: + break; + default: + _exit(0); + } + + if (setsid() == -1) + err(1, "setsid"); + + (void)dup2(devnull, STDIN_FILENO); + (void)dup2(devnull, STDOUT_FILENO); + (void)dup2(devnull, STDERR_FILENO); + (void)close(devnull); + } + if (pledge("stdio rpath wpath cpath fattr dns inet", NULL) == -1) - err(1, "pledge"); + lerr(1, "pledge"); event_init();