mirror of
https://git.proxmox.com/git/libgit2
synced 2025-11-03 11:12:27 +00:00
Merge pull request #538 from carlosmn/ref-noleak
Don't leak when deleting or removing refs
This commit is contained in:
commit
881e3da012
@ -213,7 +213,7 @@ void *git_hashtable_lookup(git_hashtable *self, const void *key)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int git_hashtable_remove(git_hashtable *self, const void *key)
|
||||
int git_hashtable_remove2(git_hashtable *self, const void *key, void **old_value)
|
||||
{
|
||||
int hash_id;
|
||||
git_hashtable_node *node;
|
||||
@ -223,6 +223,7 @@ int git_hashtable_remove(git_hashtable *self, const void *key)
|
||||
for (hash_id = 0; hash_id < GIT_HASHTABLE_HASHES; ++hash_id) {
|
||||
node = node_with_hash(self, key, hash_id);
|
||||
if (node->key && self->key_equal(key, node->key) == 0) {
|
||||
*old_value = node->value;
|
||||
node->key = NULL;
|
||||
node->value = NULL;
|
||||
self->key_count--;
|
||||
|
||||
@ -42,7 +42,15 @@ git_hashtable *git_hashtable_alloc(size_t min_size,
|
||||
git_hash_ptr hash,
|
||||
git_hash_keyeq_ptr key_eq);
|
||||
void *git_hashtable_lookup(git_hashtable *h, const void *key);
|
||||
int git_hashtable_remove(git_hashtable *table, const void *key);
|
||||
int git_hashtable_remove2(git_hashtable *table, const void *key, void **old_value);
|
||||
|
||||
GIT_INLINE(int) git_hashtable_remove(git_hashtable *table, const void *key)
|
||||
{
|
||||
void *_unused;
|
||||
return git_hashtable_remove2(table, key, &_unused);
|
||||
}
|
||||
|
||||
|
||||
void git_hashtable_free(git_hashtable *h);
|
||||
void git_hashtable_clear(git_hashtable *h);
|
||||
int git_hashtable_merge(git_hashtable *self, git_hashtable *other);
|
||||
|
||||
@ -984,14 +984,16 @@ static int reference_delete(git_reference *ref)
|
||||
* We need to reload the packfile, remove the reference from the
|
||||
* packing list, and repack */
|
||||
if (ref->flags & GIT_REF_PACKED) {
|
||||
struct packref *packref;
|
||||
/* load the existing packfile */
|
||||
if ((error = packed_load(ref->owner)) < GIT_SUCCESS)
|
||||
return git__rethrow(error, "Failed to delete reference");
|
||||
|
||||
if (git_hashtable_remove(ref->owner->references.packfile,
|
||||
ref->name) < GIT_SUCCESS)
|
||||
if (git_hashtable_remove2(ref->owner->references.packfile,
|
||||
ref->name, (void **) &packref) < GIT_SUCCESS)
|
||||
return git__throw(GIT_ENOTFOUND, "Reference not found");
|
||||
|
||||
git__free (packref);
|
||||
error = packed_write(ref->owner);
|
||||
|
||||
/* If the reference is loose, we can just remove the reference
|
||||
|
||||
Loading…
Reference in New Issue
Block a user