diff options
author | Ron Yorston <rmy@pobox.com> | 2022-04-19 14:34:18 +0100 |
---|---|---|
committer | Ron Yorston <rmy@pobox.com> | 2022-04-19 15:31:29 +0100 |
commit | 3cbe64df41eb408740a59145c6318b71f47c4f6d (patch) | |
tree | f931319c8c8f706c2222875284acfb588ccc806a | |
parent | 8bf13fbd83137c34fd3da0f8d9b47b19dc1899ac (diff) | |
download | busybox-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.c | 2 | ||||
-rw-r--r-- | win32/mingw.c | 17 |
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 | ||
47 | smallint bb_got_signal; | 47 | smallint bb_got_signal; |
48 | static mode_t current_umask = DEFAULT_UMASK; | ||
48 | 49 | ||
49 | #pragma GCC optimize ("no-if-conversion") | 50 | #pragma GCC optimize ("no-if-conversion") |
50 | int err_win_to_posix(void) | 51 | int 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 |
413 | mode_t mingw_umask(mode_t new_mode) | 414 | mode_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 | } |