dir.c: free "ident" and "exclude_per_dir" in "struct untracked_cache"
When the "ident" member of the structure was added in1e8fef609e
(untracked cache: guard and disable on system changes, 2015-03-08) this function wasn't updated to free it. Let's do so. Let's also free the "exclude_per_dir" memory we've been leaking since[1], while making sure not to free() the constant ".gitignore" string we add by default[2]. As we now have three struct members we're freeing let's change free_untracked_cache() to return early if "uc" isn't defined. We won't hand it to free() now, but that was just for convenience, once we're dealing with >=2 struct members this pattern is more convenient. 1.f9e6c64958
(untracked cache: load from UNTR index extension, 2015-03-08) 2.039bc64e88
(core.excludesfile clean-up, 2007-11-14) Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> Signed-off-by: Taylor Blau <me@ttaylorr.com>
This commit is contained in:
parent
b5fcb1c006
commit
083fd1a264
10
dir.c
10
dir.c
@ -3581,8 +3581,12 @@ static void free_untracked(struct untracked_cache_dir *ucd)
|
|||||||
|
|
||||||
void free_untracked_cache(struct untracked_cache *uc)
|
void free_untracked_cache(struct untracked_cache *uc)
|
||||||
{
|
{
|
||||||
if (uc)
|
if (!uc)
|
||||||
free_untracked(uc->root);
|
return;
|
||||||
|
|
||||||
|
free(uc->exclude_per_dir_to_free);
|
||||||
|
strbuf_release(&uc->ident);
|
||||||
|
free_untracked(uc->root);
|
||||||
free(uc);
|
free(uc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3739,7 +3743,7 @@ struct untracked_cache *read_untracked_extension(const void *data, unsigned long
|
|||||||
next + offset + hashsz);
|
next + offset + hashsz);
|
||||||
uc->dir_flags = get_be32(next + ouc_offset(dir_flags));
|
uc->dir_flags = get_be32(next + ouc_offset(dir_flags));
|
||||||
exclude_per_dir = (const char *)next + exclude_per_dir_offset;
|
exclude_per_dir = (const char *)next + exclude_per_dir_offset;
|
||||||
uc->exclude_per_dir = xstrdup(exclude_per_dir);
|
uc->exclude_per_dir = uc->exclude_per_dir_to_free = xstrdup(exclude_per_dir);
|
||||||
/* NUL after exclude_per_dir is covered by sizeof(*ouc) */
|
/* NUL after exclude_per_dir is covered by sizeof(*ouc) */
|
||||||
next += exclude_per_dir_offset + strlen(exclude_per_dir) + 1;
|
next += exclude_per_dir_offset + strlen(exclude_per_dir) + 1;
|
||||||
if (next >= end)
|
if (next >= end)
|
||||||
|
1
dir.h
1
dir.h
@ -188,6 +188,7 @@ struct untracked_cache {
|
|||||||
struct oid_stat ss_info_exclude;
|
struct oid_stat ss_info_exclude;
|
||||||
struct oid_stat ss_excludes_file;
|
struct oid_stat ss_excludes_file;
|
||||||
const char *exclude_per_dir;
|
const char *exclude_per_dir;
|
||||||
|
char *exclude_per_dir_to_free;
|
||||||
struct strbuf ident;
|
struct strbuf ident;
|
||||||
/*
|
/*
|
||||||
* dir_struct#flags must match dir_flags or the untracked
|
* dir_struct#flags must match dir_flags or the untracked
|
||||||
|
Loading…
Reference in New Issue
Block a user