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:
commit
6bcaff1a4f
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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 */
|
||||||
|
Loading…
Reference in New Issue
Block a user