Skip to content

Commit

Permalink
mingw: skip ownership check on FAT32
Browse files Browse the repository at this point in the history
The FAT file system has no concept of ACLs. Therefore, it cannot store
any ownership information anyway, and the `GetNamedSecurityInfoW()` call
pretends that everything is owned "by the world".

Let's special-case that scenario and not bother the user with an issue
that cannot be fixed using that file system anyway.

This addresses #3886

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
  • Loading branch information
dscho committed Jun 8, 2022
1 parent c5ca16f commit 543f9dc
Showing 1 changed file with 23 additions and 0 deletions.
23 changes: 23 additions & 0 deletions compat/mingw.c
Original file line number Diff line number Diff line change
Expand Up @@ -3486,6 +3486,22 @@ static PSID get_current_user_sid(void)
return result;
}

static int acls_supported(const char *path)
{
size_t offset = offset_1st_component(path);
WCHAR wroot[MAX_PATH];
DWORD file_system_flags;

if (offset &&
xutftowcs_path_ex(wroot, path, MAX_PATH, offset,
MAX_PATH, 0) > 0 &&
GetVolumeInformationW(wroot, NULL, 0, NULL, NULL,
&file_system_flags, NULL, 0))
return !!(file_system_flags & FILE_PERSISTENT_ACLS);

return 0;
}

int is_path_owned_by_current_sid(const char *path)
{
WCHAR wpath[MAX_PATH];
Expand Down Expand Up @@ -3541,6 +3557,13 @@ int is_path_owned_by_current_sid(const char *path)
* okay, too.
*/
result = 1;
else if (IsWellKnownSid(sid, WinWorldSid) &&
!acls_supported(path))
/*
* On FAT32 volumes, ownership is not actually recorded.
* Simply ignore this situation and continue.
*/
result = 1;
else if (git_env_bool("GIT_TEST_DEBUG_UNSAFE_DIRECTORIES", 0)) {
LPSTR str1, str2, to_free1 = NULL, to_free2 = NULL;

Expand Down

0 comments on commit 543f9dc

Please sign in to comment.