diff --git a/libc/calls/fstat-nt.c b/libc/calls/fstat-nt.c index 97f77eae7..b3edea321 100644 --- a/libc/calls/fstat-nt.c +++ b/libc/calls/fstat-nt.c @@ -122,34 +122,29 @@ textwindows int sys_fstat_nt_handle(int64_t handle, const char16_t *path, st.st_blksize = 4096; st.st_gid = st.st_uid = sys_getuid_nt(); - // We'll use the "umask" to fake out the mode bits. - uint32_t umask = atomic_load_explicit(&__umask, memory_order_acquire); - switch (GetFileType(handle)) { case kNtFileTypeUnknown: break; case kNtFileTypeChar: - st.st_mode = S_IFCHR | (0666 & ~umask); + st.st_mode = S_IFCHR | 0664; st.st_dev = 0x66666666; st.st_ino = handle; break; case kNtFileTypePipe: - st.st_mode = S_IFIFO | (0666 & ~umask); + st.st_mode = S_IFIFO | 0664; st.st_dev = 0x55555555; st.st_ino = handle; break; case kNtFileTypeDisk: { struct NtByHandleFileInformation wst; if (GetFileInformationByHandle(handle, &wst)) { - st.st_mode = 0444 & ~umask; + st.st_mode = 0444; if ((wst.dwFileAttributes & kNtFileAttributeDirectory) || - IsWindowsExecutable(handle, path)) { - st.st_mode |= 0111 & ~umask; - } + IsWindowsExecutable(handle, path)) + st.st_mode |= 0111; st.st_flags = wst.dwFileAttributes; - if (!(wst.dwFileAttributes & kNtFileAttributeReadonly)) { - st.st_mode |= 0222 & ~umask; - } + if (!(wst.dwFileAttributes & kNtFileAttributeReadonly)) + st.st_mode |= 0220; if (wst.dwFileAttributes & kNtFileAttributeReparsePoint) { st.st_mode |= S_IFLNK; } else if (wst.dwFileAttributes & kNtFileAttributeDirectory) { @@ -195,7 +190,7 @@ textwindows int sys_fstat_nt_handle(int64_t handle, const char16_t *path, } else if (GetVolumeInformationByHandle( handle, 0, 0, &wst.dwVolumeSerialNumber, 0, 0, 0, 0)) { st.st_dev = wst.dwVolumeSerialNumber; - st.st_mode = S_IFDIR | (0444 & ~umask); + st.st_mode = S_IFDIR | 0555; } else { // both GetFileInformationByHandle and // GetVolumeInformationByHandle failed diff --git a/libc/intrin/umask.c b/libc/intrin/umask.c index c3af0d52c..2bec074a8 100644 --- a/libc/intrin/umask.c +++ b/libc/intrin/umask.c @@ -19,4 +19,4 @@ #include "libc/atomic.h" #include "libc/calls/internal.h" -atomic_int __umask; +atomic_int __umask = 0777; diff --git a/libc/runtime/winmain.greg.c b/libc/runtime/winmain.greg.c index 113381a20..0b53545ab 100644 --- a/libc/runtime/winmain.greg.c +++ b/libc/runtime/winmain.greg.c @@ -316,7 +316,6 @@ abi int64_t WinMain(int64_t hInstance, int64_t hPrevInstance, __imp_GetSystemInfo(&si); __pagesize = si.dwPageSize; __gransize = si.dwAllocationGranularity; - __umask = 077; __pid = __imp_GetCurrentProcessId(); if (!(__sig.process = __sig_map_process(__pid, kNtOpenAlways))) __sig.process = &fake_process_signals;