Message ID | 6f81f3b2ab285f424c687072d4aef811a2471c24.1615228580.git.gitgitgadget@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Fix all leaks in t0001 | expand |
On Mon, Mar 08, 2021 at 06:36:19PM +0000, Andrzej Hunt via GitGitGadget wrote: > template_dir starts off pointing to either argv or nothing. However if > the value supplied in argv is a relative path, absolute_pathdup() is > used to turn it into an absolute path. absolute_pathdup() allocates > a new string, and we then "leak" it when cmd_init_db() completes. > > We don't bother to actually free the return value (instead we UNLEAK > it), because there's no significant advantage to doing so here. > Correctly freeing it would require more significant changes to code flow > which would be more noisy than beneficial. Makes sense. The UNLEAK() could be conditional at the end of the function (since it is OK to unleak a non-allocated variable, too), but I like keeping it here with the allocation for clarity. -Peff
diff --git a/builtin/init-db.c b/builtin/init-db.c index d31dbc883746..efc66523e22c 100644 --- a/builtin/init-db.c +++ b/builtin/init-db.c @@ -561,8 +561,10 @@ int cmd_init_db(int argc, const char **argv, const char *prefix) if (real_git_dir && !is_absolute_path(real_git_dir)) real_git_dir = real_pathdup(real_git_dir, 1); - if (template_dir && *template_dir && !is_absolute_path(template_dir)) + if (template_dir && *template_dir && !is_absolute_path(template_dir)) { template_dir = absolute_pathdup(template_dir); + UNLEAK(template_dir); + } if (argc == 1) { int mkdir_tried = 0;