[PATCH v3 3/5] setup: refactor `ensure_safe_repository()` testing priorities
From: Michael Lohmann <hidden>
Date: 2025-10-16 05:33:53
Subsystem:
the rest · Maintainer:
Linus Torvalds
With the current code, this change does not make any difference because there is no explicit rule that lets you reject a directory that the ownership-based rule may accept. In a later step in this series, however, we will introduce a mechanism to allow such an explicit rule, at which point the order of checks, i.e. seeing the explicit rule reject a directory and failing the operation before consulting the ownership-based rule, will start to matter. As a preliminary change, reorder the existing checks. Signed-off-by: Michael Lohmann <redacted> --- setup.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-)
diff --git a/setup.c b/setup.c
index c6e1204c05..5ec68be379 100644
--- a/setup.c
+++ b/setup.c@@ -1307,12 +1307,6 @@ static int ensure_safe_repository(const char *gitfile, { struct safe_directory_data data = { 0 }; - if (!git_env_bool("GIT_TEST_ASSUME_DIFFERENT_OWNER", 0) && - (!gitfile || is_path_owned_by_current_user(gitfile, report)) && - (!worktree || is_path_owned_by_current_user(worktree, report)) && - (!gitdir || is_path_owned_by_current_user(gitdir, report))) - return 1; - /* * normalize the data.path for comparison with normalized paths * that come from the configuration file. The path is unsafe
@@ -1330,7 +1324,16 @@ static int ensure_safe_repository(const char *gitfile, git_protected_config(safe_directory_cb, &data); free(data.path); - return data.is_safe; + if (data.is_safe) + return 1; + + if (!git_env_bool("GIT_TEST_ASSUME_DIFFERENT_OWNER", 0) && + (!gitfile || is_path_owned_by_current_user(gitfile, report)) && + (!worktree || is_path_owned_by_current_user(worktree, report)) && + (!gitdir || is_path_owned_by_current_user(gitdir, report))) + return 1; + + return 0; } void die_upon_unsafe_repo(const char *gitfile, const char *worktree,
--
2.51.1.476.g147428281d