diff options
author | Johannes Schindelin <johannes.schindelin@gmx.de> | 2022-08-08 13:27:49 +0000 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2022-08-08 09:31:41 -0700 |
commit | 7c83470e64eadab74689427fcd95e72f0a772ab5 (patch) | |
tree | af263dcc51eb0cc8340e5fbba954843ee5c95ae7 /compat | |
parent | e883e04b68ba7393029bcbeaa2aacb3dff5d3fbd (diff) | |
download | git-7c83470e64eadab74689427fcd95e72f0a772ab5.tar.gz |
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>
Diffstat (limited to 'compat')
-rw-r--r-- | compat/mingw.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/compat/mingw.c b/compat/mingw.c index 2c09c5bffe..22f960c7e3 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -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)) |