fprobe-1.1-pidfile-sanity.patch 1.45 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
If we are using the chroot() option or the setuid options, we must create the
pidfile before doing the chroot OR the setreuid. It's actually best for
start-stop-daemon if we create the pidfile from the master side of the fork()
before it exits, since most of the startup checks happen after the chroot()
unfortunetly.

Signed-off-by: Robin H. Johnson <robbat2@gentoo.org>

diff -Nuar fprobe-1.1.orig/src/fprobe.c fprobe-1.1/src/fprobe.c
--- fprobe-1.1.orig/src/fprobe-ulog.c	2005-01-30 08:43:35.000000000 +0000
+++ fprobe-1.1/src/fprobe-ulog.c	2008-03-16 20:51:24.000000000 +0000
@@ -1379,7 +1379,8 @@
 
 	my_log_open(ident, verbosity, log_dest);
 	if (!(log_dest & 2)) {
-		switch (fork()) {
+		pid_t childpid = fork();
+		switch (childpid) {
 			case -1:
 				fprintf(stderr, "fork(): %s", strerror(errno));
 				exit(1);
@@ -1392,6 +1393,12 @@
 				break;
 
 			default:
+				if (!(pidfile = fopen(pidfilepath, "w")))
+					my_log(LOG_ERR, "Can't create pid file. fopen(): %s", strerror(errno));
+				else {
+					fprintf(pidfile, "%ld\n", (long) childpid);
+					fclose(pidfile);
+				}
 				exit(0);
 		}
 	} else {
@@ -1548,13 +1555,6 @@
 		}
 	}
 
-	if (!(pidfile = fopen(pidfilepath, "w")))
-		my_log(LOG_ERR, "Can't create pid file. fopen(): %s", strerror(errno));
-	else {
-		fprintf(pidfile, "%ld\n", (long) pid);
-		fclose(pidfile);
-	}
-
 	my_log(LOG_INFO, "pid: %d", pid);
 	my_log(LOG_INFO, "interface: %s, datalink: %s (%d)",
 		dev, dlt[link_type_idx].descr, link_type);