aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2022-04-19 14:34:18 +0100
committerRon Yorston <rmy@pobox.com>2022-04-19 15:31:29 +0100
commit3cbe64df41eb408740a59145c6318b71f47c4f6d (patch)
treef931319c8c8f706c2222875284acfb588ccc806a
parent8bf13fbd83137c34fd3da0f8d9b47b19dc1899ac (diff)
downloadbusybox-w32-3cbe64df41eb408740a59145c6318b71f47c4f6d.tar.gz
busybox-w32-3cbe64df41eb408740a59145c6318b71f47c4f6d.tar.bz2
busybox-w32-3cbe64df41eb408740a59145c6318b71f47c4f6d.zip
win32: minor adjustments to file permissions
Mask the file permission bits in mingw_umask(), not when it's called from run_applet_no_and_exit(). Rather than hardcode write permissions for group and other in file_attr_to_st_mode() and mingw_fstat() make them respect the current umask setting. In mingw_fstat() there's no need to check the mode using S_ISDIR(): the hardcoded mode doesn't set S_IFDIR. The compiler had already figured this out so there's no reduction in bloat.
-rw-r--r--libbb/appletlib.c2
-rw-r--r--win32/mingw.c17
2 files changed, 10 insertions, 9 deletions
diff --git a/libbb/appletlib.c b/libbb/appletlib.c
index 4a4699c68..aa442144a 100644
--- a/libbb/appletlib.c
+++ b/libbb/appletlib.c
@@ -1116,7 +1116,7 @@ void FAST_FUNC run_applet_no_and_exit(int applet_no, const char *name, char **ar
1116 1116
1117 vmask = getenv("BB_UMASK"); 1117 vmask = getenv("BB_UMASK");
1118 if (vmask && sscanf(vmask, "%o", &mask) == 1) 1118 if (vmask && sscanf(vmask, "%o", &mask) == 1)
1119 umask((mode_t)(mask&0777)); 1119 umask((mode_t)mask);
1120# else 1120# else
1121 argc = string_array_len(argv); 1121 argc = string_array_len(argv);
1122# endif 1122# endif
diff --git a/win32/mingw.c b/win32/mingw.c
index f34ea1102..91c52b75c 100644
--- a/win32/mingw.c
+++ b/win32/mingw.c
@@ -45,6 +45,7 @@ unsigned int _CRT_fmode = _O_BINARY;
45#endif 45#endif
46 46
47smallint bb_got_signal; 47smallint bb_got_signal;
48static mode_t current_umask = DEFAULT_UMASK;
48 49
49#pragma GCC optimize ("no-if-conversion") 50#pragma GCC optimize ("no-if-conversion")
50int err_win_to_posix(void) 51int err_win_to_posix(void)
@@ -346,11 +347,11 @@ static inline mode_t file_attr_to_st_mode(DWORD attr)
346 if (attr & FILE_ATTRIBUTE_DIRECTORY) 347 if (attr & FILE_ATTRIBUTE_DIRECTORY)
347 fMode |= S_IFDIR|S_IXUSR|S_IXGRP|S_IXOTH; 348 fMode |= S_IFDIR|S_IXUSR|S_IXGRP|S_IXOTH;
348 else if (attr & FILE_ATTRIBUTE_DEVICE) 349 else if (attr & FILE_ATTRIBUTE_DEVICE)
349 fMode |= S_IFCHR|S_IWOTH; 350 fMode |= S_IFCHR|S_IWUSR|S_IWGRP|S_IWOTH;
350 else 351 else
351 fMode |= S_IFREG; 352 fMode |= S_IFREG;
352 if (!(attr & FILE_ATTRIBUTE_READONLY)) 353 if (!(attr & (FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_DEVICE)))
353 fMode |= S_IWUSR|S_IWGRP; 354 fMode |= (S_IWUSR|S_IWGRP|S_IWOTH) & ~(current_umask & 0022);
354 return fMode; 355 return fMode;
355} 356}
356 357
@@ -412,11 +413,10 @@ static inline int get_file_attr(const char *fname, WIN32_FILE_ATTRIBUTE_DATA *fd
412#undef umask 413#undef umask
413mode_t mingw_umask(mode_t new_mode) 414mode_t mingw_umask(mode_t new_mode)
414{ 415{
415 static mode_t old_mode = DEFAULT_UMASK;
416 mode_t tmp_mode; 416 mode_t tmp_mode;
417 417
418 tmp_mode = old_mode; 418 tmp_mode = current_umask;
419 old_mode = new_mode; 419 current_umask = new_mode & 0777;
420 420
421 umask((new_mode & S_IWUSR) ? _S_IWRITE : 0); 421 umask((new_mode & S_IWUSR) ? _S_IWRITE : 0);
422 422
@@ -720,7 +720,8 @@ int mingw_fstat(int fd, struct mingw_stat *buf)
720 if ( _fstati64(fd, &buf64) != 0 ) { 720 if ( _fstati64(fd, &buf64) != 0 ) {
721 return -1; 721 return -1;
722 } 722 }
723 buf->st_mode = S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH; 723 buf->st_mode = (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)
724 & ~(current_umask & 0022);
724 buf->st_attr = FILE_ATTRIBUTE_NORMAL; 725 buf->st_attr = FILE_ATTRIBUTE_NORMAL;
725 buf->st_size = buf64.st_size; 726 buf->st_size = buf64.st_size;
726 buf->st_atim.tv_sec = buf64.st_atime; 727 buf->st_atim.tv_sec = buf64.st_atime;
@@ -733,7 +734,7 @@ int mingw_fstat(int fd, struct mingw_stat *buf)
733#if ENABLE_FEATURE_EXTRA_FILE_DATA 734#if ENABLE_FEATURE_EXTRA_FILE_DATA
734 buf->st_dev = 0; 735 buf->st_dev = 0;
735 buf->st_ino = 0; 736 buf->st_ino = 0;
736 buf->st_nlink = S_ISDIR(buf->st_mode) ? 2 : 1; 737 buf->st_nlink = 1;
737#endif 738#endif
738 goto success; 739 goto success;
739 } 740 }