mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-09 15:00:04 +00:00
Merge pull request #2907 from jasonhaslam/git_packfile_unpack_race
Fix race in git_packfile_unpack.
This commit is contained in:
commit
5091aff782
11
src/pack.c
11
src/pack.c
@ -56,6 +56,7 @@ static git_pack_cache_entry *new_cache_object(git_rawobj *source)
|
|||||||
if (!e)
|
if (!e)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
git_atomic_inc(&e->refcount);
|
||||||
memcpy(&e->raw, source, sizeof(git_rawobj));
|
memcpy(&e->raw, source, sizeof(git_rawobj));
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
@ -145,7 +146,11 @@ static void free_lowest_entry(git_pack_cache *cache)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cache_add(git_pack_cache *cache, git_rawobj *base, git_off_t offset)
|
static int cache_add(
|
||||||
|
git_pack_cache_entry **cached_out,
|
||||||
|
git_pack_cache *cache,
|
||||||
|
git_rawobj *base,
|
||||||
|
git_off_t offset)
|
||||||
{
|
{
|
||||||
git_pack_cache_entry *entry;
|
git_pack_cache_entry *entry;
|
||||||
int error, exists = 0;
|
int error, exists = 0;
|
||||||
@ -171,6 +176,8 @@ static int cache_add(git_pack_cache *cache, git_rawobj *base, git_off_t offset)
|
|||||||
assert(error != 0);
|
assert(error != 0);
|
||||||
kh_value(cache->entries, k) = entry;
|
kh_value(cache->entries, k) = entry;
|
||||||
cache->memory_used += entry->raw.len;
|
cache->memory_used += entry->raw.len;
|
||||||
|
|
||||||
|
*cached_out = entry;
|
||||||
}
|
}
|
||||||
git_mutex_unlock(&cache->lock);
|
git_mutex_unlock(&cache->lock);
|
||||||
/* Somebody beat us to adding it into the cache */
|
/* Somebody beat us to adding it into the cache */
|
||||||
@ -702,7 +709,7 @@ int git_packfile_unpack(
|
|||||||
* long as it's not already the cached one.
|
* long as it's not already the cached one.
|
||||||
*/
|
*/
|
||||||
if (!cached)
|
if (!cached)
|
||||||
free_base = !!cache_add(&p->bases, obj, elem->base_key);
|
free_base = !!cache_add(&cached, &p->bases, obj, elem->base_key);
|
||||||
|
|
||||||
elem = &stack[elem_pos - 1];
|
elem = &stack[elem_pos - 1];
|
||||||
curpos = elem->offset;
|
curpos = elem->offset;
|
||||||
|
Loading…
Reference in New Issue
Block a user