1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-06-02 04:46:30 +02:00

mingw: be more informative when ownership check fails on FAT32

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 https://github.com/git-for-windows/git/issues/3886

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Johannes Schindelin 2022-08-08 13:27:49 +00:00 committed by Junio C Hamano
parent e883e04b68
commit 7c83470e64

View File

@ -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];
@ -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))