[PATCH 2/3] mingw: handle a file owned by the Administrators group correctly
From: Johannes Schindelin via GitGitGadget <hidden>
Date: 2022-07-13 08:21:39
Subsystem:
the rest · Maintainer:
Linus Torvalds
From: Johannes Schindelin <redacted>
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 <redacted>
---
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