util: pidfile_pid() should not unlink PID file
authorMartin Schwenke <martin@meltin.net>
Mon, 31 Jul 2017 01:37:21 +0000 (11:37 +1000)
committerMartin Schwenke <martins@samba.org>
Wed, 2 Aug 2017 01:39:11 +0000 (03:39 +0200)
This causes a race.  If 2 callers to pidfile_create() both a find a
stale PID file using pidfile_pid().  The 1st may then return to
pidfile_create() and create a new PID file, which can then be unlinked
by the 2nd caller.

Consequently, PID file creation can not depend on creating the file,
so drop O_EXCL from the call to open().

Signed-off-by: Martin Schwenke <martin@meltin.net>
Reviewed-by: Volker Lendecke <vl@samba.org>
lib/util/pidfile.c

index 5590780dd51e0a65bf82115cb219559fff229bdf..512e2fb2c22769002a00c9f421b187bb37b11cb7 100644 (file)
@@ -1,5 +1,3 @@
-/* this code is broken - there is a race condition with the unlink (tridge) */
-
 /*
    Unix SMB/CIFS implementation.
    pidfile handling
@@ -79,9 +77,6 @@ pid_t pidfile_pid(const char *piddir, const char *name)
 
  noproc:
        close(fd);
-       DEBUG(10, ("Deleting %s, since %d is not a Samba process.\n", pidFile,
-               (int)ret));
-       unlink(pidFile);
        return 0;
 }
 
@@ -105,7 +100,7 @@ void pidfile_create(const char *piddir, const char *name)
                exit(1);
        }
 
-       fd = open(pidFile, O_NONBLOCK | O_CREAT | O_WRONLY | O_EXCL, 0644);
+       fd = open(pidFile, O_NONBLOCK | O_CREAT | O_WRONLY, 0644);
        if (fd == -1) {
                DEBUG(0,("ERROR: can't open %s: Error was %s\n", pidFile,
                         strerror(errno)));