svn commit: r231087 - head/lib/libutil

Guy Helmer ghelmer at FreeBSD.org
Mon Feb 6 14:11:24 UTC 2012


Author: ghelmer
Date: Mon Feb  6 14:11:24 2012
New Revision: 231087
URL: http://svn.freebsd.org/changeset/base/231087

Log:
  Using the O_CLOEXEC flag on open(2) caused the pidfile lock to be lost
  when the child process execs daemon's target program thanks to flock(2)
  semantics. So, we apparently have to leak the open pidfile's file
  descriptor to keep the lock for the pidfile(3) functions to work properly.
  
  Test case demonstrated by trociny:
  
  ref8-amd64:/home/trociny% uname -r
  8.2-STABLE
  ref8-amd64:/home/trociny% daemon -p /tmp/sleep.pid sleep 10
  ref8-amd64:/home/trociny% daemon -p /tmp/sleep.pid sleep 10
  daemon: process already running, pid: 19799
  
  kopusha:~% uname -r
  10.0-CURRENT
  kopusha:~% daemon -p /tmp/sleep.pid sleep 10
  kopusha:~% daemon -p /tmp/sleep.pid sleep 10
  kopusha:~%

Modified:
  head/lib/libutil/pidfile.c

Modified: head/lib/libutil/pidfile.c
==============================================================================
--- head/lib/libutil/pidfile.c	Mon Feb  6 13:36:49 2012	(r231086)
+++ head/lib/libutil/pidfile.c	Mon Feb  6 14:11:24 2012	(r231087)
@@ -124,7 +124,7 @@ pidfile_open(const char *path, mode_t mo
 	 * pidfile_write() can be called multiple times.
 	 */
 	fd = flopen(pfh->pf_path,
-	    O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC | O_NONBLOCK, mode);
+	    O_WRONLY | O_CREAT | O_TRUNC | O_NONBLOCK, mode);
 	if (fd == -1) {
 		if (errno == EWOULDBLOCK && pidptr != NULL) {
 			count = 20;


More information about the svn-src-all mailing list