From: Junio C Hamano Date: Sat, 21 Mar 2015 03:26:14 GMT Subject: Re: [PATCH 01/15] read-cache: fix memleak Message-ID: In-Reply-To: <1426897692-18322-2-git-send-email-sbeller@google.com> Stefan Beller writes: > `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 `ce` or a new updated cache entry which is allocated > to new memory. In that case we need to free `ce` ourselfs. > > Signed-off-by: Stefan Beller > --- > read-cache.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/read-cache.c b/read-cache.c > index 8d71860..f72ea9f 100644 > --- a/read-cache.c > +++ b/read-cache.c > @@ -747,6 +747,8 @@ struct cache_entry *make_cache_entry(unsigned int mode, > free(ce); > return NULL; > } else { > + if (ret != ce) > + free(ce); > return ret; > } > } Good, I vaguely recall that we did something similar in another codepath that forgot the fact that refresh_cache_entry() may make the incoming ce unnecessary. As the rule is "if ret is different from ce, then ce must be freed" in this codepath, I wonder if this is easier to read: ret = refresh_cache_entry(ce, ...); if (ret != ce) free(ce); return ret;