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

[PATCH 2/3] mingw: handle a file owned by the Administrators group correctly

From
Johannes Schindelin via GitGitGadget <gitgitgadget@gmail.com>
Date
Jul 13, 2022, 08:17 UTC
Message-ID
<be06d711a1349a886cad63f8f2ec6675e6d5055e.1657700238.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.1286.git.1657700238.gitgitgadget@gmail.com>
From: Johannes Schindelin <johannes.schindelin@gmx.de>

When an Administrator creates a file or directory, the created file/directory is owned not by the Administrator SID, but by the _Administrators Group_ SID. The reason is that users with administrator privileges usually run in unprivileged ("non-elevated") mode, and their user SID does not change when running in elevated mode.

This is is relevant e.g. when running a GitHub workflow on a build agent, which runs in elevated mode: cloning a Git repository in a script step will cause the worktree to be owned by the Administrators Group SID, for example.

Let's handle this case as following: if the current user is an administrator, Git should consider a worktree owned by the Administrators Group as if it were owned by said user.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 compat/mingw.c | 10 ++++++++++
 1 file changed, 10 insertions(+)
diff --git a/compat/mingw.c b/compat/mingw.c
index 912444fb3ab..e0e020ee574 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -2669,6 +2669,7 @@ int is_path_owned_by_current_sid(const char *path)
 	else if (sid && IsValidSid(sid)) {
 		/* Now, verify that the SID matches the current user's */
 		static PSID current_user_sid;
+		BOOL is_member;
 
 		if (!current_user_sid)
 			current_user_sid = get_current_user_sid();
@@ -2677,6 +2678,15 @@ int is_path_owned_by_current_sid(const char *path)
 		    IsValidSid(current_user_sid) &&
 		    EqualSid(sid, current_user_sid))
 			result = 1;
+		else if (IsWellKnownSid(sid, WinBuiltinAdministratorsSid) &&
+			 CheckTokenMembership(NULL, sid, &is_member) &&
+			 is_member)
+			/*
+			 * If owned by the Administrators group, and the
+			 * current user is an administrator, we consider that
+			 * okay, too.
+			 */
+			result = 1;
 		else if (git_env_bool("GIT_TEST_DEBUG_UNSAFE_DIRECTORIES", 0)) {
 			LPSTR str1, str2, to_free1 = NULL, to_free2 = NULL;
 
-- 
gitgitgadget
Previous: Johannes SchindelinNext: Johannes Schindelin via GitGitGadget
Message 7 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.