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
This commit is contained in:
Eli Zaretskii 2013-02-27 20:37:31 +02:00
parent f2c8840090
commit 531e70eca4
2 changed files with 17 additions and 4 deletions

View 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):

View 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);