summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Martín Nieto <cmn@dwim.me>2013-08-12 11:50:27 +0200
committerCarlos Martín Nieto <cmn@dwim.me>2013-08-12 11:50:27 +0200
commite54cfb9b544eeac2924f45fc7752c2a7be709a03 (patch)
tree159b376f5ca1c53eccd90b73c321a000a0941e0c
parent8ca093991d3105e62a6f509e9763c1f72040e1c7 (diff)
downloadlibgit2-e54cfb9b544eeac2924f45fc7752c2a7be709a03.tar.gz
odb: free object data when id is ambiguous
By the time we recognise this as an ambiguous id, the object's data has been loaded into memory. Free it when returning EABMIGUOUS.
-rw-r--r--src/odb.c4
-rw-r--r--tests-clar/odb/mixed.c1
2 files changed, 4 insertions, 1 deletions
diff --git a/src/odb.c b/src/odb.c
index 23eb4e12e..6969cf772 100644
--- a/src/odb.c
+++ b/src/odb.c
@@ -786,8 +786,10 @@ attempt_lookup:
git__free(data);
data = raw.data;
- if (found && git_oid__cmp(&full_oid, &found_full_oid))
+ if (found && git_oid__cmp(&full_oid, &found_full_oid)) {
+ git__free(raw.data);
return git_odb__error_ambiguous("multiple matches for prefix");
+ }
found_full_oid = full_oid;
found = true;
diff --git a/tests-clar/odb/mixed.c b/tests-clar/odb/mixed.c
index dd4587831..51970ceec 100644
--- a/tests-clar/odb/mixed.c
+++ b/tests-clar/odb/mixed.c
@@ -22,6 +22,7 @@ void test_odb_mixed__dup_oid(void) {
cl_git_pass(git_oid_fromstr(&oid, hex));
cl_git_pass(git_odb_read_prefix(&obj, _odb, &oid, GIT_OID_HEXSZ));
+ git_odb_object_free(obj);
cl_git_pass(git_oid_fromstrn(&oid, short_hex, sizeof(short_hex) - 1));
cl_git_pass(git_odb_read_prefix(&obj, _odb, &oid, sizeof(short_hex) - 1));
git_odb_object_free(obj);