Skip to content

Commit

Permalink
mingw: be more informative when ownership check fails 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 tell the user what's going on.

This addresses git-for-windows#3886

Signed-off-by: Johannes Schindelin <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
dscho authored and gitster committed Aug 8, 2022
1 parent e883e04 commit 7c83470
Showing 1 changed file with 24 additions and 1 deletion.
25 changes: 24 additions & 1 deletion compat/mingw.c
Original file line number Diff line number Diff line change
Expand Up @@ -2674,6 +2674,21 @@ 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 &&
xutftowcsn(wroot, path, MAX_PATH, offset) > 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, struct strbuf *report)
{
WCHAR wpath[MAX_PATH];
Expand Down Expand Up @@ -2721,7 +2736,15 @@ int is_path_owned_by_current_sid(const char *path, struct strbuf *report)
IsValidSid(current_user_sid) &&
EqualSid(sid, current_user_sid))
result = 1;
else if (report) {
else if (report &&
IsWellKnownSid(sid, WinWorldSid) &&
!acls_supported(path)) {
/*
* On FAT32 volumes, ownership is not actually recorded.
*/
strbuf_addf(report, "'%s' is on a file system that does"
"not record ownership\n", path);
} else if (report) {
LPSTR str1, str2, to_free1 = NULL, to_free2 = NULL;

if (ConvertSidToStringSidA(sid, &str1))
Expand Down

0 comments on commit 7c83470

Please sign in to comment.