From c9bb5d101ca657fa466afa8c4368c43ea7b7aca8 Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Mon, 2 Jan 2017 17:22:33 +0100 Subject: git_exec_path: avoid Coverity warning about unfree()d result Technically, it is correct that git_exec_path() returns a possibly malloc()ed string returned from system_path(), and it is sometimes not allocated. Cache the result in a static variable and make sure that we call system_path() only once, which plugs a potential leak. Signed-off-by: Johannes Schindelin Signed-off-by: Junio C Hamano --- exec_cmd.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'exec_cmd.c') diff --git a/exec_cmd.c b/exec_cmd.c index 9d5703a15..eae56fefb 100644 --- a/exec_cmd.c +++ b/exec_cmd.c @@ -69,6 +69,7 @@ void git_set_argv_exec_path(const char *exec_path) const char *git_exec_path(void) { const char *env; + static char *system_exec_path; if (argv_exec_path) return argv_exec_path; @@ -78,7 +79,9 @@ const char *git_exec_path(void) return env; } - return system_path(GIT_EXEC_PATH); + if (!system_exec_path) + system_exec_path = system_path(GIT_EXEC_PATH); + return system_exec_path; } static void add_path(struct strbuf *out, const char *path) -- cgit v1.2.1 From 007ac544011213045e3905983b4350ffec8f41f7 Mon Sep 17 00:00:00 2001 From: Jeff King Date: Mon, 9 Jan 2017 01:00:12 -0500 Subject: git_exec_path: do not return the result of getenv() The result of getenv() is not guaranteed by POSIX to last beyond another call to getenv(), or setenv(), etc. We should duplicate the string before returning to the caller to avoid any surprises. We already keep a cached pointer to avoid repeatedly leaking the result of system_path(). We can use the same pointer here to avoid allocating and leaking for each call. Signed-off-by: Jeff King Signed-off-by: Junio C Hamano --- exec_cmd.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) (limited to 'exec_cmd.c') diff --git a/exec_cmd.c b/exec_cmd.c index eae56fefb..31ceb3338 100644 --- a/exec_cmd.c +++ b/exec_cmd.c @@ -68,20 +68,19 @@ void git_set_argv_exec_path(const char *exec_path) /* Returns the highest-priority, location to look for git programs. */ const char *git_exec_path(void) { - const char *env; - static char *system_exec_path; + static char *cached_exec_path; if (argv_exec_path) return argv_exec_path; - env = getenv(EXEC_PATH_ENVIRONMENT); - if (env && *env) { - return env; + if (!cached_exec_path) { + const char *env = getenv(EXEC_PATH_ENVIRONMENT); + if (env && *env) + cached_exec_path = xstrdup(env); + else + cached_exec_path = system_path(GIT_EXEC_PATH); } - - if (!system_exec_path) - system_exec_path = system_path(GIT_EXEC_PATH); - return system_exec_path; + return cached_exec_path; } static void add_path(struct strbuf *out, const char *path) -- cgit v1.2.1