From 59efba64ac144a8838a35ae687b8c5bb6cd43363 Mon Sep 17 00:00:00 2001 From: Jonathan Nieder Date: Mon, 9 Aug 2010 22:28:07 -0500 Subject: [PATCH 1/3] core: Stop leaking ondisk_cache_entrys Noticed with valgrind. Signed-off-by: Jonathan Nieder Signed-off-by: Junio C Hamano --- read-cache.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/read-cache.c b/read-cache.c index f1f789b7b8..1f42473e80 100644 --- a/read-cache.c +++ b/read-cache.c @@ -1516,6 +1516,7 @@ static int ce_write_entry(git_SHA_CTX *c, int fd, struct cache_entry *ce) int size = ondisk_ce_size(ce); struct ondisk_cache_entry *ondisk = xcalloc(1, size); char *name; + int result; ondisk->ctime.sec = htonl(ce->ce_ctime.sec); ondisk->mtime.sec = htonl(ce->ce_mtime.sec); @@ -1539,7 +1540,9 @@ static int ce_write_entry(git_SHA_CTX *c, int fd, struct cache_entry *ce) name = ondisk->name; memcpy(name, ce->name, ce_namelen(ce)); - return ce_write(c, fd, ondisk, size); + result = ce_write(c, fd, ondisk, size); + free(ondisk); + return result; } int write_index(struct index_state *istate, int newfd) From 1ce584b05843dfa8b0fe31ed3d75bddf1c29c4e0 Mon Sep 17 00:00:00 2001 From: Jonathan Nieder Date: Mon, 9 Aug 2010 22:33:44 -0500 Subject: [PATCH 2/3] read-tree: stop leaking tree objects The underlying problem is that the fill_tree_descriptor() API is easy to misuse, and this patch does not fix that. Signed-off-by: Jonathan Nieder Signed-off-by: Junio C Hamano --- unpack-trees.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/unpack-trees.c b/unpack-trees.c index 8cf0da317d..f561d88156 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -329,6 +329,7 @@ static int traverse_trees_recursive(int n, unsigned long dirmask, unsigned long { int i, ret, bottom; struct tree_desc t[MAX_UNPACK_TREES]; + void *buf[MAX_UNPACK_TREES]; struct traverse_info newinfo; struct name_entry *p; @@ -346,12 +347,16 @@ static int traverse_trees_recursive(int n, unsigned long dirmask, unsigned long const unsigned char *sha1 = NULL; if (dirmask & 1) sha1 = names[i].sha1; - fill_tree_descriptor(t+i, sha1); + buf[i] = fill_tree_descriptor(t+i, sha1); } bottom = switch_cache_bottom(&newinfo); ret = traverse_trees(n, t, &newinfo); restore_cache_bottom(&newinfo, bottom); + + for (i = 0; i < n; i++) + free(buf[i]); + return ret; } From b6b56aceb85fe05dc681ac7ee1249e6b6e26e957 Mon Sep 17 00:00:00 2001 From: Jonathan Nieder Date: Mon, 9 Aug 2010 22:32:11 -0500 Subject: [PATCH 3/3] write-tree: Avoid leak when index refers to an invalid object MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Noticed by valgrind during test t0000.35 “writing this tree without --missing-ok”. Even in the cherry-pick foo..bar code path, such an error is the end of the line. But maybe some day an interactive porcelain will want to link to libgit, making this matter. Signed-off-by: Jonathan Nieder Signed-off-by: Junio C Hamano --- cache-tree.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cache-tree.c b/cache-tree.c index d91743775d..c60cf9140d 100644 --- a/cache-tree.c +++ b/cache-tree.c @@ -328,9 +328,11 @@ static int update_one(struct cache_tree *it, mode = ce->ce_mode; entlen = pathlen - baselen; } - if (mode != S_IFGITLINK && !missing_ok && !has_sha1_file(sha1)) + if (mode != S_IFGITLINK && !missing_ok && !has_sha1_file(sha1)) { + strbuf_release(&buffer); return error("invalid object %06o %s for '%.*s'", mode, sha1_to_hex(sha1), entlen+baselen, path); + } if (ce->ce_flags & CE_REMOVE) continue; /* entry being removed */