From 8e177b2bb8cacc3ca9e1edd301a8aa1132f300af Mon Sep 17 00:00:00 2001 From: Bryan Woods Date: Thu, 10 Sep 2015 14:44:52 -0700 Subject: [PATCH 1/3] Fixing dangling pointers in git_mempack_reset git_mempack_reset was leaving free'd pointers in the oidmap. --- src/odb_mempack.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/odb_mempack.c b/src/odb_mempack.c index 34355270f..538dfc521 100644 --- a/src/odb_mempack.c +++ b/src/odb_mempack.c @@ -154,6 +154,9 @@ void git_mempack_reset(git_odb_backend *_backend) }); git_array_clear(db->commits); + + git_oidmap_free(db->objects); + db->objects = git_oidmap_alloc(); } static void impl__free(git_odb_backend *_backend) From 707f65372b4091ada386f2a04a05e94899e32bfc Mon Sep 17 00:00:00 2001 From: Bryan Woods Date: Fri, 11 Sep 2015 16:35:14 -0700 Subject: [PATCH 2/3] Removing memory leak in mempack's free It calls git_mempack_reset which reallocates the object array. git_oidmap_free is now called on it explicitly. --- src/odb_mempack.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/odb_mempack.c b/src/odb_mempack.c index 538dfc521..25f30590c 100644 --- a/src/odb_mempack.c +++ b/src/odb_mempack.c @@ -161,8 +161,12 @@ void git_mempack_reset(git_odb_backend *_backend) static void impl__free(git_odb_backend *_backend) { - git_mempack_reset(_backend); - git__free(_backend); + struct memory_packer_db *db = (struct memory_packer_db *)_backend; + + git_mempack_reset(db); + git_oidmap_free(db->objects); + + git__free(db); } int git_mempack_new(git_odb_backend **out) From 220d6f8a104661ae9edc4f96cd8f520ef4c4dc1d Mon Sep 17 00:00:00 2001 From: Edward Thomson Date: Fri, 11 Sep 2015 20:06:14 -0400 Subject: [PATCH 3/3] mempack: expose clear function --- src/odb_mempack.c | 5 +---- src/oidmap.h | 2 ++ 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/odb_mempack.c b/src/odb_mempack.c index 25f30590c..594a2784c 100644 --- a/src/odb_mempack.c +++ b/src/odb_mempack.c @@ -155,17 +155,14 @@ void git_mempack_reset(git_odb_backend *_backend) git_array_clear(db->commits); - git_oidmap_free(db->objects); - db->objects = git_oidmap_alloc(); + git_oidmap_clear(db->objects); } static void impl__free(git_odb_backend *_backend) { struct memory_packer_db *db = (struct memory_packer_db *)_backend; - git_mempack_reset(db); git_oidmap_free(db->objects); - git__free(db); } diff --git a/src/oidmap.h b/src/oidmap.h index d2c451e7f..2cf208f53 100644 --- a/src/oidmap.h +++ b/src/oidmap.h @@ -49,4 +49,6 @@ GIT_INLINE(khint_t) git_oidmap_hash(const git_oid *oid) #define git_oidmap_size(h) kh_size(h) +#define git_oidmap_clear(h) kh_clear(oid, h) + #endif