]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix race conditions with MS-Windows lock files by using _sopen.
authorEli Zaretskii <eliz@gnu.org>
Wed, 27 Feb 2013 18:37:31 +0000 (20:37 +0200)
committerEli Zaretskii <eliz@gnu.org>
Wed, 27 Feb 2013 18:37:31 +0000 (20:37 +0200)
 src/filelock.c (create_lock_file) [WINDOWSNT]: Use _sopen with
 _SH_DENYRW flag, instead of emacs_open, to deny any other process
 access to the lock file until it is written and closed.

Fixes: debbugs:13807
src/ChangeLog
src/filelock.c

index f5617487fdaa1bfd761157207bd2cc428415a8a4..4135dadf28a6d1547db7bedb292bc2fb54c84305 100644 (file)
@@ -1,3 +1,10 @@
+2013-02-27  Eli Zaretskii  <eliz@gnu.org>
+
+       * filelock.c (create_lock_file) [WINDOWSNT]: Use _sopen with
+       _SH_DENYRW flag, instead of emacs_open, to deny any other process
+       access to the lock file until it is written and closed.
+       (Bug#13807)
+
 2013-02-27  Paul Eggert  <eggert@cs.ucla.edu>
 
        * callint.c (Qcall_interactively):
index 4d556de245481eeec0b88b5689207799d405948f..78cd60a12e10e3a167bf3f1c10c194e7efcd2360 100644 (file)
@@ -44,6 +44,7 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #include "coding.h"
 #include "systime.h"
 #ifdef WINDOWSNT
+#include <share.h>
 #include "w32.h"       /* for dostounix_filename */
 #endif
 
@@ -353,12 +354,17 @@ create_lock_file (char *lfname, char *lock_info_str, bool force)
      create a regular file with the lock info written as its
      contents.  */
   {
-    int fd = emacs_open (lfname, O_WRONLY | O_BINARY | O_CREAT | O_EXCL,
-                        S_IREAD | S_IWRITE);
+    /* Deny everybody else any kind of access to the file until we are
+       done writing it and close the handle.  This makes the entire
+       open/write/close operation atomic, as far as other processes
+       are concerned.  */
+    int fd = _sopen (lfname,
+                    _O_WRONLY | _O_BINARY | _O_CREAT | _O_EXCL | _O_NOINHERIT,
+                    _SH_DENYRW, S_IREAD | S_IWRITE);
 
     if (fd < 0 && errno == EEXIST && force)
-      fd = emacs_open (lfname, O_WRONLY | O_BINARY | O_TRUNC,
-                      S_IREAD | S_IWRITE);
+      fd = _sopen (lfname, _O_WRONLY | _O_BINARY | _O_TRUNC |_O_NOINHERIT,
+                  _SH_DENYRW, S_IREAD | S_IWRITE);
     if (fd >= 0)
       {
        ssize_t lock_info_len = strlen (lock_info_str);