From 0915a5b4cdf00a8c6c755b77b854725a183993b4 Mon Sep 17 00:00:00 2001 From: Alexandr Miloslavskiy Date: Fri, 6 Mar 2020 19:03:13 +0000 Subject: set_git_dir: fix crash when used with real_path() `real_path()` returns result from a shared buffer, inviting subtle reentrance bugs. One of these bugs occur when invoked this way: set_git_dir(real_path(git_dir)) In this case, `real_path()` has reentrance: real_path read_gitfile_gently repo_set_gitdir setup_git_env set_git_dir_1 set_git_dir Later, `set_git_dir()` uses its now-dead parameter: !is_absolute_path(path) Fix this by using a dedicated `strbuf` to hold `strbuf_realpath()`. Signed-off-by: Alexandr Miloslavskiy Signed-off-by: Junio C Hamano --- builtin/init-db.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'builtin') diff --git a/builtin/init-db.c b/builtin/init-db.c index 944ec77fe1..5bf61a7e05 100644 --- a/builtin/init-db.c +++ b/builtin/init-db.c @@ -356,12 +356,12 @@ int init_db(const char *git_dir, const char *real_git_dir, if (!exist_ok && !stat(real_git_dir, &st)) die(_("%s already exists"), real_git_dir); - set_git_dir(real_path(real_git_dir)); + set_git_dir(real_git_dir, 1); git_dir = get_git_dir(); separate_git_dir(git_dir, original_git_dir); } else { - set_git_dir(real_path(git_dir)); + set_git_dir(git_dir, 1); git_dir = get_git_dir(); } startup_info->have_repository = 1; -- cgit v1.3-5-g45d5