Tentative fix for bug #13546 with failure to save files on Windows.
authorEli Zaretskii <eliz@gnu.org>
Sun, 27 Jan 2013 08:04:16 +0000 (10:04 +0200)
committerEli Zaretskii <eliz@gnu.org>
Sun, 27 Jan 2013 08:04:16 +0000 (10:04 +0200)
 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.

src/ChangeLog
src/w32.c

index a5108f7..0fd8357 100644 (file)
@@ -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)
index 3e300d1..8024031 100644 (file)
--- 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;
 }