Skip to content

Commit

Permalink
git_exec_path: do not return the result of getenv()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
peff authored and gitster committed Jan 9, 2017
1 parent c9bb5d1 commit 007ac54
Showing 1 changed file with 8 additions and 9 deletions.
17 changes: 8 additions & 9 deletions exec_cmd.c
Expand Up @@ -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)
Expand Down

0 comments on commit 007ac54

Please sign in to comment.