summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjörn Steinbrink <B.Steinbrink@gmx.de>2008-10-18 00:37:31 (GMT)
committerJunio C Hamano <gitster@pobox.com>2008-10-18 13:19:06 (GMT)
commit1fb23e65503b4927fa1d4b59f9fbe27668ce347d (patch)
treee74dba546b3962bd66ab24cee8b25d6d0cc97a02
parent72130808173d3dfee85f2a29548fa9fec33a5351 (diff)
downloadgit-1fb23e65503b4927fa1d4b59f9fbe27668ce347d.zip
git-1fb23e65503b4927fa1d4b59f9fbe27668ce347d.tar.gz
git-1fb23e65503b4927fa1d4b59f9fbe27668ce347d.tar.bz2
force_object_loose: Fix memory leak
read_packed_sha1 expectes its caller to free the buffer it returns, which force_object_loose didn't do. This leak is eventually triggered by "git gc", when it is manually invoked or there are too many packs around, making gc totally unusable when there are lots of unreachable objects. Signed-off-by: Björn Steinbrink <B.Steinbrink@gmx.de> Acked-by: Nicolas Pitre <nico@cam.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--sha1_file.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/sha1_file.c b/sha1_file.c
index e2cb342..c785071 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -2322,6 +2322,7 @@ int force_object_loose(const unsigned char *sha1, time_t mtime)
enum object_type type;
char hdr[32];
int hdrlen;
+ int ret;
if (has_loose_object(sha1))
return 0;
@@ -2329,7 +2330,10 @@ int force_object_loose(const unsigned char *sha1, time_t mtime)
if (!buf)
return error("cannot read sha1_file for %s", sha1_to_hex(sha1));
hdrlen = sprintf(hdr, "%s %lu", typename(type), len) + 1;
- return write_loose_object(sha1, hdr, hdrlen, buf, len, mtime);
+ ret = write_loose_object(sha1, hdr, hdrlen, buf, len, mtime);
+ free(buf);
+
+ return ret;
}
int has_pack_index(const unsigned char *sha1)