Patch for lib/libc/gen/daemon.[3c] to resolve PR 25462
Guy Helmer
ghelmer at palisadesys.com
Wed Jul 16 08:02:25 PDT 2003
I'd like to offer this patch for review to see whether anyone objects or
whether it contains style issues. It resolves the problem where
daemon(3) can cause a SIGHUP that kills the daemon process under certain
circumstances. I've been running this patch on my 5-current machine for
a couple of months without any problems.
Guy
ghelmer at freebsd.org
Index: lib/libc/gen/daemon.3
===================================================================
RCS file: /home/ncvs/src/lib/libc/gen/daemon.3,v
retrieving revision 1.12
diff -u -r1.12 daemon.3
--- lib/libc/gen/daemon.3 16 Jan 2002 15:21:39 -0000 1.12
+++ lib/libc/gen/daemon.3 24 Apr 2003 21:52:06 -0000
@@ -71,12 +71,14 @@
function may fail and set
.Va errno
for any of the errors specified for the library functions
-.Xr fork 2
+.Xr fork 2 ,
+.Xr setsid 2
and
-.Xr setsid 2 .
+.Xr sigaction 2 .
.Sh SEE ALSO
.Xr fork 2 ,
-.Xr setsid 2
+.Xr setsid 2 ,
+.Xr sigaction 2
.Sh HISTORY
The
.Fn daemon
@@ -101,3 +103,17 @@
.Fn daemon
before opening any files or sockets, or verify that any file
descriptors obtained have values greater than 2.
+.Pp
+The
+.Fn daemon
+function temporarily ignores
+.Dv SIGHUP
+and then restores the original settings for
+.Dv SIGHUP
+after calling
+.Xr setsid 2
+to prevent a parent session group leader's calls to
+.Xr fork 2
+and then
+.Xr _exit 2
+from prematurely terminating the child process.
Index: lib/libc/gen/daemon.c
===================================================================
RCS file: /home/ncvs/src/lib/libc/gen/daemon.c,v
retrieving revision 1.5
diff -u -r1.5 daemon.c
--- lib/libc/gen/daemon.c 1 Feb 2002 00:57:29 -0000 1.5
+++ lib/libc/gen/daemon.c 1 May 2003 20:54:29 -0000
@@ -38,8 +38,10 @@
__FBSDID("$FreeBSD: src/lib/libc/gen/daemon.c,v 1.5 2002/02/01 00:57:29
obrien Exp $");
#include "namespace.h"
+#include <errno.h>
#include <fcntl.h>
#include <paths.h>
+#include <signal.h>
#include <unistd.h>
#include "un-namespace.h"
@@ -48,6 +50,16 @@
int nochdir, noclose;
{
int fd;
+ pid_t newgrp;
+ int oerrno;
+ int osa_ok;
+ struct sigaction sa, osa;
+
+ /* A SIGHUP may be thrown when the parent exits below. */
+ sigemptyset(&sa.sa_mask);
+ sa.sa_handler = SIG_IGN;
+ sa.sa_flags = 0;
+ osa_ok = sigaction(SIGHUP, &sa, &osa);
switch (fork()) {
case -1:
@@ -58,7 +70,13 @@
_exit(0);
}
- if (setsid() == -1)
+ newgrp = setsid();
+ oerrno = errno;
+ if (osa_ok != -1)
+ if (sigaction(SIGHUP, &osa, (struct sigaction *)NULL) == -1)
+ return (-1); /* Could not restore SIGHUP. */
+ errno = oerrno;
+ if (newgrp == -1)
return (-1);
if (!nochdir)
More information about the freebsd-audit
mailing list