path: root/builtin
diff options
authorAlexandr Miloslavskiy <>2020-03-06 19:03:13 (GMT)
committerJunio C Hamano <>2020-03-06 22:45:51 (GMT)
commit0915a5b4cdf00a8c6c755b77b854725a183993b4 (patch)
tree9614e0bd72e228432eeb16a1c7219deb0061e3ed /builtin
parent076cbdcd739aeb33c1be87b73aebae5e43d7bcc5 (diff)
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 <>
Diffstat (limited to 'builtin')
1 files changed, 2 insertions, 2 deletions
diff --git a/builtin/init-db.c b/builtin/init-db.c
index 944ec77..5bf61a7 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;