summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Stefan Beller <sbeller@google.com>2015-03-23 10:57:11 -0700
committerLibravatar Junio C Hamano <gitster@pobox.com>2015-03-23 11:12:59 -0700
commit915e44c6357f3bd9d5fa498a201872c4367302d3 (patch)
tree5a266853f74dff3c34666f005719bd34bb423a35
parentadd_to_index(): free unused cache-entry (diff)
downloadtgif-915e44c6357f3bd9d5fa498a201872c4367302d3.tar.xz
read-cache: fix memleak
`ce` is allocated in make_cache_entry and should be freed if it is not used any more. refresh_cache_entry as a wrapper around refresh_cache_ent will either return - the `ce` given as the parameter, when it was up-to-date; - a new updated cache entry which is allocated to new memory; or - a NULL when refreshing failed. In the latter two cases, the original cache-entry `ce` is not used and needs to be freed. The rule can be expressed as "if the return value from refresh is different from the original ce, ce is no longer used." Helped-by: Junio C Hamano <gitster@pobox.com> Signed-off-by: Stefan Beller <sbeller@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--read-cache.c7
1 files changed, 2 insertions, 5 deletions
diff --git a/read-cache.c b/read-cache.c
index 5b922fd583..0052b72d9c 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -748,12 +748,9 @@ struct cache_entry *make_cache_entry(unsigned int mode,
ce->ce_mode = create_ce_mode(mode);
ret = refresh_cache_entry(ce, refresh_options);
- if (!ret) {
+ if (ret != ce)
free(ce);
- return NULL;
- } else {
- return ret;
- }
+ return ret;
}
int ce_same_name(const struct cache_entry *a, const struct cache_entry *b)