summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlhchavez <lhchavez@lhchavez.com>2019-02-16 19:55:30 -0800
committerlhchavez <lhchavez@lhchavez.com>2019-02-20 06:31:38 -0800
commit6b3730d4b997e979c7578bf5c2da3c33aa89b023 (patch)
tree52d86ef99ce20c7aedaa352183faa922c98ecda8
parent12c6e1facc1b7644ed2c51df35625b36bad92340 (diff)
downloadlibgit2-6b3730d4b997e979c7578bf5c2da3c33aa89b023.tar.gz
Fix a memory leak in odb_otype_fast()
This change frees a copy of a cached object in odb_otype_fast().
-rw-r--r--src/odb.c1
-rw-r--r--tests/odb/mixed.c21
2 files changed, 22 insertions, 0 deletions
diff --git a/src/odb.c b/src/odb.c
index 6ab4bd99a..6a7e7ca7e 100644
--- a/src/odb.c
+++ b/src/odb.c
@@ -1128,6 +1128,7 @@ static int odb_otype_fast(git_object_t *type_p, git_odb *db, const git_oid *id)
if ((object = git_cache_get_raw(odb_cache(db), id)) != NULL) {
*type_p = object->cached.type;
+ git_odb_object_free(object);
return 0;
}
diff --git a/tests/odb/mixed.c b/tests/odb/mixed.c
index ba2b2acb7..87e945c83 100644
--- a/tests/odb/mixed.c
+++ b/tests/odb/mixed.c
@@ -263,3 +263,24 @@ void test_odb_mixed__expand_ids(void)
git__free(ids);
}
+void test_odb_mixed__expand_ids_cached(void)
+{
+ git_odb_expand_id *ids;
+ size_t i, num;
+
+ /* test looking for the actual (correct) types after accessing the object */
+
+ setup_prefix_query(&ids, &num);
+
+ for (i = 0; i < num; i++) {
+ git_odb_object *obj;
+ if (ids[i].type == GIT_OBJECT_ANY)
+ continue;
+ cl_git_pass(git_odb_read_prefix(&obj, _odb, &ids[i].id, ids[i].length));
+ git_odb_object_free(obj);
+ }
+
+ cl_git_pass(git_odb_expand_ids(_odb, ids, num));
+ assert_found_objects(ids);
+ git__free(ids);
+}