Fix bug #16299 with assertion violation in set-default-file-modes on Windows.

src/w32.c (sys_umask): New function.

 nt/inc/ms-w32.h (umask) [emacs]: Redirect to sys_umask.
This commit is contained in:
Eli Zaretskii 2013-12-30 19:51:28 +02:00
parent 634425957a
commit 1b7259fce2
4 changed files with 40 additions and 1 deletions

View file

@ -1,3 +1,7 @@
2013-12-30 Eli Zaretskii <eliz@gnu.org>
* inc/ms-w32.h (umask) [emacs]: Redirect to sys_umask. (Bug#16299)
2013-12-23 Eli Zaretskii <eliz@gnu.org>
* README.W32:

View file

@ -235,6 +235,9 @@ extern struct tm * sys_localtime (const time_t *);
extern int sys_unlink (const char *);
#undef write
#define write sys_write
#undef umask
#define umask sys_umask
extern int sys_umask (int);
/* Subprocess calls that are emulated. */
#define spawnve sys_spawnve
@ -276,7 +279,6 @@ typedef int pid_t;
#define lseek _lseek
#define popen _popen
#define pclose _pclose
#define umask _umask
#define strdup _strdup
#define strupr _strupr
#define strnicmp _strnicmp

View file

@ -1,3 +1,7 @@
2013-12-30 Eli Zaretskii <eliz@gnu.org>
* w32.c (sys_umask): New function. (Bug#16299)
2013-12-30 Martin Rudalics <rudalics@gmx.at>
* dispnew.c (change_frame_size_1): Take old width of root window

View file

@ -5265,6 +5265,35 @@ utime (const char *name, struct utimbuf *times)
return 0;
}
/* Emacs expects us to support the traditional octal form of the mode
bits, which is not what msvcrt.dll wants. */
#define WRITE_USER 00200
int
sys_umask (int mode)
{
static int current_mask;
int retval, arg = 0;
/* The only bit we really support is the write bit. Files are
always readable on MS-Windows, and the execute bit does not exist
at all. */
/* FIXME: if the GROUP and OTHER bits are reset, we should use ACLs
to prevent access by other users on NTFS. */
if ((mode & WRITE_USER) != 0)
arg |= S_IWRITE;
retval = _umask (arg);
/* Merge into the return value the bits they've set the last time,
which msvcrt.dll ignores and never returns. Emacs insists on its
notion of mask being identical to what we return. */
retval |= (current_mask & ~WRITE_USER);
current_mask = mode;
return retval;
}
/* Symlink-related functions. */
#ifndef SYMBOLIC_LINK_FLAG_DIRECTORY