summaryrefslogtreecommitdiff
path: root/exec_cmd.c
diff options
context:
space:
mode:
authorJeff King <peff@peff.net>2017-01-09 01:00:12 -0500
committerJunio C Hamano <gitster@pobox.com>2017-01-09 01:29:50 -0800
commit007ac544011213045e3905983b4350ffec8f41f7 (patch)
treea65a572c581f00418229920f40868af9b8c8a344 /exec_cmd.c
parentc9bb5d101ca657fa466afa8c4368c43ea7b7aca8 (diff)
downloadgit-007ac544011213045e3905983b4350ffec8f41f7.tar.gz
git_exec_path: do not return the result of getenv()js/exec-path-coverity-workaround
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 <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'exec_cmd.c')
-rw-r--r--exec_cmd.c17
1 files changed, 8 insertions, 9 deletions
diff --git a/exec_cmd.c b/exec_cmd.c
index eae56fefba..31ceb33383 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)