Skip to content

Offer more details to users about the ownership check on FAT32 #3887

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jun 23, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 24 additions & 1 deletion 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,7 +3557,14 @@ int is_path_owned_by_current_sid(const char *path)
* okay, too.
*/
result = 1;
else if (git_env_bool("GIT_TEST_DEBUG_UNSAFE_DIRECTORIES", 0)) {
else if (IsWellKnownSid(sid, WinWorldSid) &&
git_env_bool("GIT_TEST_DEBUG_UNSAFE_DIRECTORIES", 0) &&
!acls_supported(path)) {
/*
* On FAT32 volumes, ownership is not actually recorded.
*/
warning("'%s' is on a file system that does not record ownership", path);
} else if (git_env_bool("GIT_TEST_DEBUG_UNSAFE_DIRECTORIES", 0)) {
LPSTR str1, str2, to_free1 = NULL, to_free2 = NULL;

if (ConvertSidToStringSidA(sid, &str1))
Expand Down
11 changes: 9 additions & 2 deletions setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -1385,10 +1385,17 @@ const char *setup_git_directory_gently(int *nongit_ok)
if (!nongit_ok) {
struct strbuf prequoted = STRBUF_INIT;
struct strbuf quoted = STRBUF_INIT;
struct strbuf hint = STRBUF_INIT;

#ifdef __MINGW32__
if (dir.buf[0] == '/')
strbuf_addstr(&prequoted, "%(prefix)/");
if (!git_env_bool("GIT_TEST_DEBUG_UNSAFE_DIRECTORIES", 0))
strbuf_addstr(&hint,
_("\n\nSet the environment variable "
"GIT_TEST_DEBUG_UNSAFE_DIRECTORIES=true "
"and run\n"
"again for more information."));
#endif

strbuf_add(&prequoted, dir.buf, dir.len);
Expand All @@ -1397,8 +1404,8 @@ const char *setup_git_directory_gently(int *nongit_ok)
die(_("unsafe repository ('%s' is owned by someone else)\n"
"To add an exception for this directory, call:\n"
"\n"
"\tgit config --global --add safe.directory %s"),
dir.buf, quoted.buf);
"\tgit config --global --add safe.directory %s%s"),
dir.buf, quoted.buf, hint.buf);
}
*nongit_ok = 1;
break;
Expand Down