summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2013-01-27 10:04:16 +0200
committerEli Zaretskii <eliz@gnu.org>2013-01-27 10:04:16 +0200
commit224f4ec1298e93e4d18bba7ea208b08c75ae3422 (patch)
tree651cf0eee0c3e66d022c1c939a5b0e9bd687ae2c
parentbeb6d07d1005f6dd8a17ba6f3e8406aaf47d5130 (diff)
downloademacs-224f4ec1298e93e4d18bba7ea208b08c75ae3422.tar.gz
Tentative fix for bug #13546 with failure to save files on Windows.
src/w32.c (sys_open): Zero out the flags for the new file descriptor. (sys_close): Zero out the flags for the file descriptor before closing it.
-rw-r--r--src/ChangeLog6
-rw-r--r--src/w32.c15
2 files changed, 15 insertions, 6 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index a5108f79f3d..0fd835747ce 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,9 @@
+2013-01-27 Eli Zaretskii <eliz@gnu.org>
+
+ * w32.c (sys_open): Zero out the flags for the new file descriptor.
+ (sys_close): Zero out the flags for the file descriptor before
+ closing it. (Bug#13546)
+
2013-01-26 Eli Zaretskii <eliz@gnu.org>
* w32.c (parse_root, get_volume_info, readdir, read_unc_volume)
diff --git a/src/w32.c b/src/w32.c
index 3e300d1b9a3..802403168f0 100644
--- a/src/w32.c
+++ b/src/w32.c
@@ -3124,9 +3124,12 @@ sys_open (const char * path, int oflag, int mode)
and system files. Force all file handles to be
non-inheritable. */
int res = _open (mpath, (oflag & ~_O_CREAT) | _O_NOINHERIT, mode);
- if (res >= 0)
- return res;
- return _open (mpath, oflag | _O_NOINHERIT, mode);
+ if (res < 0)
+ res = _open (mpath, oflag | _O_NOINHERIT, mode);
+ if (res >= 0 && res < MAXDESC)
+ fd_info[res].flags = 0;
+
+ return res;
}
int
@@ -6135,15 +6138,15 @@ sys_close (int fd)
}
}
+ if (fd >= 0 && fd < MAXDESC)
+ fd_info[fd].flags = 0;
+
/* Note that sockets do not need special treatment here (at least on
NT and Windows 95 using the standard tcp/ip stacks) - it appears that
closesocket is equivalent to CloseHandle, which is to be expected
because socket handles are fully fledged kernel handles. */
rc = _close (fd);
- if (rc == 0 && fd < MAXDESC)
- fd_info[fd].flags = 0;
-
return rc;
}