git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 4/5] mingw: be more informative when ownership check fails on FAT32

From
Johannes Schindelin via GitGitGadget <gitgitgadget@gmail.com>
Date
Aug 8, 2022, 13:27 UTC
Message-ID
<7aaa6248dfef7fb8436b5fbccf4689d0be3226a5.1659965270.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.1286.v2.git.1659965270.gitgitgadget@gmail.com>
From: Johannes Schindelin <johannes.schindelin@gmx.de>

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>
---
 compat/mingw.c | 25 ++++++++++++++++++++++++-
 1 file changed, 24 insertions(+), 1 deletion(-)
diff --git a/compat/mingw.c b/compat/mingw.c
index 2c09c5bffee..22f960c7e34 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))
-- 
gitgitgadget
Previous: Johannes Schindelin via GitGitGadgetNext: Johannes Schindelin via GitGitGadget
Message 13 of 16 in “Some improvements to safe.directory on Windows”
  1. 0/3 Some improvements to safe.directory on WindowsJohannes Schindelin via GitGitGadget, Jul 13, 2022
  2. 1/3 Allow debugging unsafe directories' ownershipJohannes Schindelin via GitGitGadget, Jul 13, 2022
  3. Junio C HamanoJul 13, 2022
  4. Junio C HamanoJul 14, 2022
  5. Johannes SchindelinJul 15, 2022
  6. Johannes SchindelinAug 8, 2022
  7. 2/3 mingw: handle a file owned by the Administrators group correctlyJohannes Schindelin via GitGitGadget, Jul 13, 2022
  8. 3/3 mingw: be more informative when ownership check fails on FAT32Johannes Schindelin via GitGitGadget, Jul 13, 2022
  9. 0/5 Some improvements to safe.directory on WindowsJohannes Schindelin via GitGitGadget, Aug 8, 2022
  10. 1/5 setup: fix some formattingJohannes Schindelin via GitGitGadget, Aug 8, 2022
  11. 2/5 Prepare for more detailed "dubious ownership" messagesJohannes Schindelin via GitGitGadget, Aug 8, 2022
  12. 3/5 mingw: provide details about unsafe directories' ownershipJohannes Schindelin via GitGitGadget, Aug 8, 2022
  13. 4/5 mingw: be more informative when ownership check fails on FAT32Johannes Schindelin via GitGitGadget, Aug 8, 2022
  14. 5/5 mingw: handle a file owned by the Administrators group correctlyJohannes Schindelin via GitGitGadget, Aug 8, 2022
  15. Junio C HamanoAug 8, 2022
  16. Johannes SchindelinAug 9, 2022

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.