[CRT] Update file descriptor handling to match Wine (3/7). CORE-14504
authorThomas Faber <thomas.faber@reactos.org>
Sun, 25 Mar 2018 14:15:31 +0000 (16:15 +0200)
committerThomas Faber <thomas.faber@reactos.org>
Mon, 26 Mar 2018 11:00:15 +0000 (13:00 +0200)
Import Wine commits by Piotr Caban:
6c2d4f1092d msvcrt: Use fd critical section in _fstat64.
9278190d468 msvcrt: Use fd critical section in _futime64.

sdk/lib/crt/include/internal/wine/msvcrt.h
sdk/lib/crt/stdio/file.c
sdk/lib/crt/stdio/stat64.c
sdk/lib/crt/time/futime.c

index 5dc3a37..ab37a4a 100644 (file)
@@ -153,4 +153,13 @@ typedef struct _sig_element
 char* _setlocale(int,const char*);
 NTSYSAPI VOID NTAPI RtlAssert(PVOID FailedAssertion,PVOID FileName,ULONG LineNumber,PCHAR Message);
 
+/* ioinfo structure size is different in msvcrXX.dll's */
+typedef struct {
+    HANDLE              handle;
+    unsigned char       wxflag;
+    char                lookahead[3];
+    int                 exflag;
+    CRITICAL_SECTION    crit;
+} ioinfo;
+
 #endif /* __WINE_MSVCRT_H */
index 878f3b1..dde5a8e 100644 (file)
@@ -45,6 +45,7 @@
 
 #include <precomp.h>
 #include "wine/unicode.h"
+#include "internal/wine/msvcrt.h"
 
 #include <sys/utime.h>
 #include <direct.h>
@@ -113,15 +114,6 @@ static char utf16_bom[2] = { 0xff, 0xfe };
 
 #define MSVCRT_INTERNAL_BUFSIZ 4096
 
-/* ioinfo structure size is different in msvcrXX.dll's */
-typedef struct {
-    HANDLE              handle;
-    unsigned char       wxflag;
-    char                lookahead[3];
-    int                 exflag;
-    CRITICAL_SECTION    crit;
-} ioinfo;
-
 /*********************************************************************
  *             __pioinfo (MSVCRT.@)
  * array of pointers to ioinfo arrays [32]
@@ -180,7 +172,7 @@ static inline ioinfo* get_ioinfo_nolock(int fd)
     return ret + (fd%MSVCRT_FD_BLOCK_SIZE);
 }
 
-static inline ioinfo* get_ioinfo(int fd)
+/*static*/ inline ioinfo* get_ioinfo(int fd)
 {
     ioinfo *ret = get_ioinfo_nolock(fd);
     if(ret->exflag & EF_CRIT_INIT)
@@ -188,7 +180,7 @@ static inline ioinfo* get_ioinfo(int fd)
     return ret;
 }
 
-static inline void release_ioinfo(ioinfo *info)
+/*static*/ inline void release_ioinfo(ioinfo *info)
 {
     if(info->exflag & EF_CRIT_INIT)
         LeaveCriticalSection(&info->crit);
index 41340bb..98e63c5 100644 (file)
@@ -1,8 +1,10 @@
 #include <precomp.h>
 #include <tchar.h>
 #include <direct.h>
+#include <internal/wine/msvcrt.h>
 
-HANDLE fdtoh(int fd);
+inline ioinfo* get_ioinfo(int fd);
+inline void release_ioinfo(ioinfo *info);
 
 #define ALL_S_IREAD  (_S_IREAD  | (_S_IREAD  >> 3) | (_S_IREAD  >> 6))
 #define ALL_S_IWRITE (_S_IWRITE | (_S_IWRITE >> 3) | (_S_IWRITE >> 6))
@@ -97,25 +99,29 @@ int CDECL _tstat64(const _TCHAR *path, struct __stat64 *buf)
 
 int CDECL _fstat64(int fd, struct __stat64* buf)
 {
+  ioinfo *info = get_ioinfo(fd);
   DWORD dw;
   DWORD type;
   BY_HANDLE_FILE_INFORMATION hfi;
-  HANDLE hand = fdtoh(fd);
 
-  TRACE(":fd (%d) stat (%p)\n",fd,buf);
-  if (hand == INVALID_HANDLE_VALUE)
+  TRACE(":fd (%d) stat (%p)\n", fd, buf);
+  if (info->handle == INVALID_HANDLE_VALUE)
+  {
+    release_ioinfo(info);
     return -1;
+  }
 
   if (!buf)
   {
     WARN(":failed-NULL buf\n");
     _dosmaperr(ERROR_INVALID_PARAMETER);
+    release_ioinfo(info);
     return -1;
   }
 
   memset(&hfi, 0, sizeof(hfi));
   memset(buf, 0, sizeof(struct __stat64));
-  type = GetFileType(hand);
+  type = GetFileType(info->handle);
   if (type == FILE_TYPE_PIPE)
   {
     buf->st_dev = buf->st_rdev = fd;
@@ -130,10 +136,11 @@ int CDECL _fstat64(int fd, struct __stat64* buf)
   }
   else /* FILE_TYPE_DISK etc. */
   {
-    if (!GetFileInformationByHandle(hand, &hfi))
+    if (!GetFileInformationByHandle(info->handle, &hfi))
     {
       WARN(":failed-last error (%d)\n",GetLastError());
       _dosmaperr(ERROR_INVALID_PARAMETER);
+      release_ioinfo(info);
       return -1;
     }
     buf->st_mode = _S_IFREG | ALL_S_IREAD;
@@ -148,6 +155,7 @@ int CDECL _fstat64(int fd, struct __stat64* buf)
   }
   TRACE(":dwFileAttributes = 0x%x, mode set to 0x%x\n",hfi.dwFileAttributes,
    buf->st_mode);
+  release_ioinfo(info);
   return 0;
 }
 
index 834b527..535012c 100644 (file)
 #include <time.h>
 #include <sys/utime.h>
 #include "bitsfixup.h"
+#include <internal/wine/msvcrt.h>
 
-HANDLE fdtoh(int fd);
+inline ioinfo* get_ioinfo(int fd);
+inline void release_ioinfo(ioinfo *info);
 
 /******************************************************************************
  * \name _futime
@@ -52,12 +54,12 @@ HANDLE fdtoh(int fd);
 int
 _futime(int fd, struct _utimbuf *filetime)
 {
-    HANDLE handle;
+    ioinfo *info = get_ioinfo(fd);
     FILETIME at, wt;
 
-    handle = fdtoh(fd);
-    if (handle == INVALID_HANDLE_VALUE)
+    if (info->handle == INVALID_HANDLE_VALUE)
     {
+        release_ioinfo(info);
         return -1;
     }
 
@@ -84,11 +86,12 @@ _futime(int fd, struct _utimbuf *filetime)
         }
     }
 
-    if (!SetFileTime(handle, NULL, &at, &wt))
+    if (!SetFileTime(info->handle, NULL, &at, &wt))
     {
+        release_ioinfo(info);
         _dosmaperr(GetLastError());
         return -1 ;
     }
-
+    release_ioinfo(info);
     return 0;
 }