From 556a29436361a9f4b65cc2386e999b89199d3170 Mon Sep 17 00:00:00 2001 From: Justine Tunney Date: Sun, 22 Sep 2024 16:51:57 -0700 Subject: [PATCH] Improve Windows mode bits We were too zealous about security before by only setting the owner bits and that would cause issues for projects like redbean that check "other" bits to determine if it's safe to serve a file. Since that doesn't exist on Windows, it's better to have things work than not work. So what we'll do instead is return modes like 0664 for files and 0775 for directories. --- libc/calls/fstat-nt.c | 21 ++++++++------------- libc/intrin/umask.c | 2 +- libc/runtime/winmain.greg.c | 1 - 3 files changed, 9 insertions(+), 15 deletions(-) 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;