From 97959981f614893f9c29a5baad17a313d09fdf1b Mon Sep 17 00:00:00 2001 From: bagajjal Date: Mon, 16 Oct 2017 14:46:37 -0700 Subject: [PATCH] More fix of sftp scp file permission and test cases (#222) More fix of sftp scp file permission and test cases --- contrib/win32/win32compat/misc.c | 28 ++++++++++++---------- regress/unittests/win32compat/file_tests.c | 25 ++++++++++++++++++- 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/contrib/win32/win32compat/misc.c b/contrib/win32/win32compat/misc.c index 6c45174fb..8a8a7972d 100644 --- a/contrib/win32/win32compat/misc.c +++ b/contrib/win32/win32compat/misc.c @@ -1321,13 +1321,13 @@ get_final_mode(int allow_mode, int deny_mode) if (!allow_mode) return allow_mode; if(deny_mode & S_IROTH) - allow_mode = (allow_mode | S_IROTH) ^ S_IROTH; + allow_mode = allow_mode & ~S_IROTH; if (deny_mode & S_IWOTH) - allow_mode = (allow_mode | S_IWOTH) ^ S_IWOTH; + allow_mode = allow_mode & ~S_IWOTH; if (deny_mode & S_IXOTH) - allow_mode = (allow_mode | S_IXOTH) ^ S_IXOTH; + allow_mode = allow_mode & ~S_IXOTH; return allow_mode; } @@ -1368,18 +1368,20 @@ get_others_file_permissions(wchar_t * file_name, int isReadOnlyFile) current_aceHeader = (PACE_HEADER)current_ace; /* only interested in Allow ACE */ - if (!(current_aceHeader->AceType == ACCESS_ALLOWED_ACE_TYPE || - current_aceHeader->AceType == ACCESS_DENIED_ACE_TYPE)) - continue; - - PACCESS_ALLOWED_ACE pAllowedAce = (PACCESS_ALLOWED_ACE)current_ace; - current_trustee_sid = &(pAllowedAce->SidStart); - + if (current_aceHeader->AceType == ACCESS_ALLOWED_ACE_TYPE) { + PACCESS_ALLOWED_ACE pAllowedAce = (PACCESS_ALLOWED_ACE)current_ace; + current_trustee_sid = &(pAllowedAce->SidStart); + current_access_mask = pAllowedAce->Mask; + } else if (current_aceHeader->AceType == ACCESS_DENIED_ACE_TYPE) { + PACCESS_DENIED_ACE pDeniedAce = (PACCESS_DENIED_ACE)current_ace; + current_trustee_sid = &(pDeniedAce->SidStart); + current_access_mask = pDeniedAce->Mask; + } else continue; + if (!(IsWellKnownSid(current_trustee_sid, WinWorldSid) || IsWellKnownSid(current_trustee_sid, WinAuthenticatedUserSid))) continue; - - current_access_mask = pAllowedAce->Mask; + if ((current_access_mask & READ_PERMISSIONS) == READ_PERMISSIONS) mode_tmp |= S_IROTH; @@ -1399,7 +1401,7 @@ get_others_file_permissions(wchar_t * file_name, int isReadOnlyFile) allow_mode_auth_users |= mode_tmp; else deny_mode_auth_users |= mode_tmp; - } + } } allow_mode_world = get_final_mode(allow_mode_world, deny_mode_world); diff --git a/regress/unittests/win32compat/file_tests.c b/regress/unittests/win32compat/file_tests.c index c95938321..a9750ca52 100644 --- a/regress/unittests/win32compat/file_tests.c +++ b/regress/unittests/win32compat/file_tests.c @@ -123,7 +123,7 @@ void file_simple_fileio() retValue = stat(tmp_filename, &st); ASSERT_INT_EQ(retValue, 0); ASSERT_INT_EQ(st.st_size, strlen(small_write_buf)); - ASSERT_INT_EQ(st.st_mode & 0777, 0666); + ASSERT_INT_EQ(st.st_mode & 0777, 0600); char mode[12]; strmode(st.st_mode, mode); ASSERT_CHAR_EQ(mode[0], '-'); @@ -463,6 +463,29 @@ file_miscellaneous_tests() retValue = w32_allocate_fd_for_handle(h, FALSE); ASSERT_HANDLE(h); + f = open(tmp_filename, O_RDWR | O_CREAT | O_TRUNC, 0666); + ASSERT_INT_NE(f, -1); + wchar_t *t = utf8_to_utf16(tmp_filename); + ASSERT_PTR_NE(t, NULL); + int perm = get_others_file_permissions(t, 0); + ASSERT_INT_EQ(perm, 7); + free(t); + close(f); + retValue = unlink(tmp_filename); + ASSERT_INT_EQ(retValue, 0); + + + f = open(tmp_filename, O_RDWR | O_CREAT | O_TRUNC, 0666); + ASSERT_INT_NE(f, -1); + t = utf8_to_utf16(tmp_filename); + ASSERT_PTR_NE(t, NULL); + perm = get_others_file_permissions(t, 1); + ASSERT_INT_EQ(perm, 5); + free(t); + close(f); + retValue = unlink(tmp_filename); + ASSERT_INT_EQ(retValue, 0); + TEST_DONE(); }