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 --- environment.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'environment.c') diff --git a/environment.c b/environment.c index e72a02d0d5..c436de31ee 100644 --- a/environment.c +++ b/environment.c @@ -345,11 +345,20 @@ static void update_relative_gitdir(const char *name, free(path); } -void set_git_dir(const char *path) +void set_git_dir(const char *path, int make_realpath) { + struct strbuf realpath = STRBUF_INIT; + + if (make_realpath) { + strbuf_realpath(&realpath, path, 1); + path = realpath.buf; + } + set_git_dir_1(path); if (!is_absolute_path(path)) chdir_notify_register(NULL, update_relative_gitdir, NULL); + + strbuf_release(&realpath); } const char *get_log_output_encoding(void) -- cgit v1.2.3