diff options
author | Kevin Willford <kewillf@microsoft.com> | 2017-08-21 15:24:31 -0600 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2017-08-21 15:57:02 -0700 |
commit | b50386c7c038ccea8f70d2a66ac78f189240ef05 (patch) | |
tree | eb83302d980c895b1ab5320270371152c04b18d5 | |
parent | 3921a0b3c3441d189f838656b30fbafa25e9eec4 (diff) | |
download | git-b50386c7c038ccea8f70d2a66ac78f189240ef05.tar.gz git-b50386c7c038ccea8f70d2a66ac78f189240ef05.tar.xz |
read-cache: fix memory leak in do_write_index
The previous_name_buf was never getting released when there
was an error in ce_write_entry or allow was false and execution
was returned to the caller.
Signed-off-by: Kevin Willford <kewillf@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | read-cache.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/read-cache.c b/read-cache.c index acfb028f4..47220cc30 100644 --- a/read-cache.c +++ b/read-cache.c @@ -2192,7 +2192,7 @@ static int do_write_index(struct index_state *istate, struct tempfile *tempfile, int newfd = tempfile->fd; git_SHA_CTX c; struct cache_header hdr; - int i, err, removed, extended, hdr_version; + int i, err = 0, removed, extended, hdr_version; struct cache_entry **cache = istate->cache; int entries = istate->cache_nr; struct stat st; @@ -2247,15 +2247,21 @@ static int do_write_index(struct index_state *istate, struct tempfile *tempfile, if (allow) warning(msg, ce->name); else - return error(msg, ce->name); + err = error(msg, ce->name); drop_cache_tree = 1; } if (ce_write_entry(&c, newfd, ce, previous_name) < 0) - return -1; + err = -1; + + if (err) + break; } strbuf_release(&previous_name_buf); + if (err) + return err; + /* Write extension data here */ if (!strip_extensions && istate->split_index) { struct strbuf sb = STRBUF_INIT; |