From 543f9dcb88a245099b0ce746237963985a4e5381 Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Wed, 8 Jun 2022 11:56:03 +0200 Subject: [PATCH] mingw: skip ownership check 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 not bother the user with an issue that cannot be fixed using that file system anyway. This addresses https://github.com/git-for-windows/git/issues/3886 Signed-off-by: Johannes Schindelin --- compat/mingw.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/compat/mingw.c b/compat/mingw.c index 182498bbb48526..653214eb3d9ee2 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -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]; @@ -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;