[3/3] msvcrt: Fix the permissions returned by fstat*() (with test).

Francois Gouget fgouget at free.fr
Tue Dec 9 08:19:20 CST 2008


---

Notice how st_mode contains 0666, thus showing we should have a
correct S_IWUSR even on Windows (if we are to use it instead of
S_IWRITE, see the recent port patch).

 dlls/msvcrt/file.c       |    4 ++--
 dlls/msvcrt/tests/file.c |    2 ++
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c
index 7c0f74d..78861e4 100644
--- a/dlls/msvcrt/file.c
+++ b/dlls/msvcrt/file.c
@@ -1167,9 +1167,9 @@ int CDECL MSVCRT__fstat64(int fd, struct MSVCRT__stat64* buf)
       msvcrt_set_errno(ERROR_INVALID_PARAMETER);
       return -1;
     }
-    buf->st_mode = S_IFREG | S_IREAD;
+    buf->st_mode = S_IFREG | 0444;
     if (!(hfi.dwFileAttributes & FILE_ATTRIBUTE_READONLY))
-      buf->st_mode |= S_IWRITE;
+      buf->st_mode |= 0222;
     buf->st_size  = ((__int64)hfi.nFileSizeHigh << 32) + hfi.nFileSizeLow;
     RtlTimeToSecondsSince1970((LARGE_INTEGER *)&hfi.ftLastAccessTime, &dw);
     buf->st_atime = dw;
diff --git a/dlls/msvcrt/tests/file.c b/dlls/msvcrt/tests/file.c
index c925948..8dcba00 100644
--- a/dlls/msvcrt/tests/file.c
+++ b/dlls/msvcrt/tests/file.c
@@ -905,6 +905,7 @@ static void test_stat(void)
     {
         ok(fstat(fd, &buf) == 0, "fstat failed: errno=%d", errno);
         ok((buf.st_mode & _S_IFMT) == _S_IFREG, "bad format = %06o\n", buf.st_mode);
+        ok((buf.st_mode & 0777) == 0666, "bad st_mode = %06o\n", buf.st_mode);
         ok(buf.st_dev == 0, "st_dev is %d, expected 0\n", buf.st_dev);
         ok(buf.st_dev == buf.st_rdev, "st_dev (%d) and st_rdev (%d) differ\n", buf.st_dev, buf.st_rdev);
         ok(buf.st_nlink == 1, "st_nlink is %d, expected 1\n", buf.st_nlink);
@@ -912,6 +913,7 @@ static void test_stat(void)
 
         ok(stat("stat.tst", &buf) == 0, "stat failed: errno=%d", errno);
         ok((buf.st_mode & _S_IFMT) == _S_IFREG, "bad format = %06o\n", buf.st_mode);
+        ok((buf.st_mode & 0777) == 0666, "bad st_mode = %06o\n", buf.st_mode);
         ok(buf.st_dev == buf.st_rdev, "st_dev (%d) and st_rdev (%d) differ\n", buf.st_dev, buf.st_rdev);
         ok(buf.st_nlink == 1, "st_nlink is %d, expected 1\n", buf.st_nlink);
         ok(buf.st_size == 0, "st_size is %d, expected 0\n", buf.st_size);
-- 
1.5.6.5



More information about the wine-patches mailing list