Merge branch 'jc/exec-cmd-system-path-leak-fix'

The function sometimes returned a non-freeable memory and some
other times returned a piece of memory that must be freed.

* jc/exec-cmd-system-path-leak-fix:
  system_path(): always return free'able memory to the caller
This commit is contained in:
Junio C Hamano 2014-12-22 12:27:01 -08:00
commit 6bcaff1a4f
4 changed files with 21 additions and 12 deletions

View File

@ -321,16 +321,18 @@ static void setup_man_path(void)
{ {
struct strbuf new_path = STRBUF_INIT; struct strbuf new_path = STRBUF_INIT;
const char *old_path = getenv("MANPATH"); const char *old_path = getenv("MANPATH");
char *git_man_path = system_path(GIT_MAN_PATH);
/* We should always put ':' after our path. If there is no /* We should always put ':' after our path. If there is no
* old_path, the ':' at the end will let 'man' to try * old_path, the ':' at the end will let 'man' to try
* system-wide paths after ours to find the manual page. If * system-wide paths after ours to find the manual page. If
* there is old_path, we need ':' as delimiter. */ * there is old_path, we need ':' as delimiter. */
strbuf_addstr(&new_path, system_path(GIT_MAN_PATH)); strbuf_addstr(&new_path, git_man_path);
strbuf_addch(&new_path, ':'); strbuf_addch(&new_path, ':');
if (old_path) if (old_path)
strbuf_addstr(&new_path, old_path); strbuf_addstr(&new_path, old_path);
free(git_man_path);
setenv("MANPATH", new_path.buf, 1); setenv("MANPATH", new_path.buf, 1);
strbuf_release(&new_path); strbuf_release(&new_path);
@ -380,8 +382,10 @@ static void show_info_page(const char *git_cmd)
static void get_html_page_path(struct strbuf *page_path, const char *page) static void get_html_page_path(struct strbuf *page_path, const char *page)
{ {
struct stat st; struct stat st;
char *to_free = NULL;
if (!html_path) if (!html_path)
html_path = system_path(GIT_HTML_PATH); html_path = to_free = system_path(GIT_HTML_PATH);
/* Check that we have a git documentation directory. */ /* Check that we have a git documentation directory. */
if (!strstr(html_path, "://")) { if (!strstr(html_path, "://")) {
@ -392,6 +396,7 @@ static void get_html_page_path(struct strbuf *page_path, const char *page)
strbuf_init(page_path, 0); strbuf_init(page_path, 0);
strbuf_addf(page_path, "%s/%s.html", html_path, page); strbuf_addf(page_path, "%s/%s.html", html_path, page);
free(to_free);
} }
/* /*

View File

@ -119,15 +119,18 @@ static void copy_templates(const char *template_dir)
DIR *dir; DIR *dir;
const char *git_dir = get_git_dir(); const char *git_dir = get_git_dir();
int len = strlen(git_dir); int len = strlen(git_dir);
char *to_free = NULL;
if (!template_dir) if (!template_dir)
template_dir = getenv(TEMPLATE_DIR_ENVIRONMENT); template_dir = getenv(TEMPLATE_DIR_ENVIRONMENT);
if (!template_dir) if (!template_dir)
template_dir = init_db_template_dir; template_dir = init_db_template_dir;
if (!template_dir) if (!template_dir)
template_dir = system_path(DEFAULT_GIT_TEMPLATE_DIR); template_dir = to_free = system_path(DEFAULT_GIT_TEMPLATE_DIR);
if (!template_dir[0]) if (!template_dir[0]) {
free(to_free);
return; return;
}
template_len = strlen(template_dir); template_len = strlen(template_dir);
if (PATH_MAX <= (template_len+strlen("/config"))) if (PATH_MAX <= (template_len+strlen("/config")))
die(_("insanely long template path %s"), template_dir); die(_("insanely long template path %s"), template_dir);
@ -139,7 +142,7 @@ static void copy_templates(const char *template_dir)
dir = opendir(template_path); dir = opendir(template_path);
if (!dir) { if (!dir) {
warning(_("templates not found %s"), template_dir); warning(_("templates not found %s"), template_dir);
return; goto free_return;
} }
/* Make sure that template is from the correct vintage */ /* Make sure that template is from the correct vintage */
@ -155,8 +158,7 @@ static void copy_templates(const char *template_dir)
"a wrong format version %d from '%s'"), "a wrong format version %d from '%s'"),
repository_format_version, repository_format_version,
template_dir); template_dir);
closedir(dir); goto close_free_return;
return;
} }
memcpy(path, git_dir, len); memcpy(path, git_dir, len);
@ -166,7 +168,10 @@ static void copy_templates(const char *template_dir)
copy_templates_1(path, len, copy_templates_1(path, len,
template_path, template_len, template_path, template_len,
dir); dir);
close_free_return:
closedir(dir); closedir(dir);
free_return:
free(to_free);
} }
static int git_init_db_config(const char *k, const char *v, void *cb) static int git_init_db_config(const char *k, const char *v, void *cb)

View File

@ -6,7 +6,7 @@
static const char *argv_exec_path; static const char *argv_exec_path;
static const char *argv0_path; static const char *argv0_path;
const char *system_path(const char *path) char *system_path(const char *path)
{ {
#ifdef RUNTIME_PREFIX #ifdef RUNTIME_PREFIX
static const char *prefix; static const char *prefix;
@ -16,7 +16,7 @@ const char *system_path(const char *path)
struct strbuf d = STRBUF_INIT; struct strbuf d = STRBUF_INIT;
if (is_absolute_path(path)) if (is_absolute_path(path))
return path; return xstrdup(path);
#ifdef RUNTIME_PREFIX #ifdef RUNTIME_PREFIX
assert(argv0_path); assert(argv0_path);
@ -34,8 +34,7 @@ const char *system_path(const char *path)
#endif #endif
strbuf_addf(&d, "%s/%s", prefix, path); strbuf_addf(&d, "%s/%s", prefix, path);
path = strbuf_detach(&d, NULL); return strbuf_detach(&d, NULL);
return path;
} }
const char *git_extract_argv0_path(const char *argv0) const char *git_extract_argv0_path(const char *argv0)

View File

@ -9,6 +9,6 @@ extern const char **prepare_git_cmd(const char **argv);
extern int execv_git_cmd(const char **argv); /* NULL terminated */ extern int execv_git_cmd(const char **argv); /* NULL terminated */
LAST_ARG_MUST_BE_NULL LAST_ARG_MUST_BE_NULL
extern int execl_git_cmd(const char *cmd, ...); extern int execl_git_cmd(const char *cmd, ...);
extern const char *system_path(const char *path); extern char *system_path(const char *path);
#endif /* GIT_EXEC_CMD_H */ #endif /* GIT_EXEC_CMD_H */