From: Eli Zaretskii Date: Wed, 27 Feb 2013 18:37:31 +0000 (+0200) Subject: Fix race conditions with MS-Windows lock files by using _sopen. X-Git-Tag: emacs-24.3.90~173^2~6^2~31 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=531e70eca4c3bcd44942a67f5ea1a8bb1cb41dad;p=emacs.git Fix race conditions with MS-Windows lock files by using _sopen. 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 --- diff --git a/src/ChangeLog b/src/ChangeLog index f5617487fda..4135dadf28a 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,10 @@ +2013-02-27 Eli Zaretskii + + * 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 * callint.c (Qcall_interactively): diff --git a/src/filelock.c b/src/filelock.c index 4d556de2454..78cd60a12e1 100644 --- a/src/filelock.c +++ b/src/filelock.c @@ -44,6 +44,7 @@ along with GNU Emacs. If not, see . */ #include "coding.h" #include "systime.h" #ifdef WINDOWSNT +#include #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);