diff options
author | Junio C Hamano <gitster@pobox.com> | 2014-12-22 23:27:01 +0300 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2014-12-22 23:27:01 +0300 |
commit | 6bcaff1a4fe4a3088348e706c149941c74d1ad61 (patch) | |
tree | a03cc8a4a3b8fa2cdf06bdbed93ee8a1aac2692d /builtin/init-db.c | |
parent | 5109f2aaabcd7ce2c493bb663417c2dd4d5b81fe (diff) | |
parent | 59362e560d3c439e77768983b00eade08be9bc3e (diff) |
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
Diffstat (limited to 'builtin/init-db.c')
-rw-r--r-- | builtin/init-db.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/builtin/init-db.c b/builtin/init-db.c index 2619ca5881..9966522b4a 100644 --- a/builtin/init-db.c +++ b/builtin/init-db.c @@ -119,15 +119,18 @@ static void copy_templates(const char *template_dir) DIR *dir; const char *git_dir = get_git_dir(); int len = strlen(git_dir); + char *to_free = NULL; if (!template_dir) template_dir = getenv(TEMPLATE_DIR_ENVIRONMENT); if (!template_dir) template_dir = init_db_template_dir; if (!template_dir) - template_dir = system_path(DEFAULT_GIT_TEMPLATE_DIR); - if (!template_dir[0]) + template_dir = to_free = system_path(DEFAULT_GIT_TEMPLATE_DIR); + if (!template_dir[0]) { + free(to_free); return; + } template_len = strlen(template_dir); if (PATH_MAX <= (template_len+strlen("/config"))) die(_("insanely long template path %s"), template_dir); @@ -139,7 +142,7 @@ static void copy_templates(const char *template_dir) dir = opendir(template_path); if (!dir) { warning(_("templates not found %s"), template_dir); - return; + goto free_return; } /* 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'"), repository_format_version, template_dir); - closedir(dir); - return; + goto close_free_return; } memcpy(path, git_dir, len); @@ -166,7 +168,10 @@ static void copy_templates(const char *template_dir) copy_templates_1(path, len, template_path, template_len, dir); +close_free_return: closedir(dir); +free_return: + free(to_free); } static int git_init_db_config(const char *k, const char *v, void *cb) |