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 <alexandr.miloslavskiy@syntevo.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
076cbdcd73
commit
0915a5b4cd
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user