Commit 531e70ec authored by Eli Zaretskii's avatar Eli Zaretskii
Browse files

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
parent f2c88400
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):
......
......@@ -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);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment