summaryrefslogtreecommitdiff
path: root/src/pack-objects.c
diff options
context:
space:
mode:
authorEdward Thomson <ethomson@microsoft.com>2015-02-13 09:35:20 -0500
committerEdward Thomson <ethomson@microsoft.com>2015-02-13 09:35:20 -0500
commit0f07d54b44825399e5d13499328135771c8d0b43 (patch)
tree7e0a99a24bc86db609dbb74fbb222b6aabb56240 /src/pack-objects.c
parentd97d9559e321ac2ef2ae81a6cfd308a841ef7581 (diff)
downloadlibgit2-0f07d54b44825399e5d13499328135771c8d0b43.tar.gz
pack-objects: unlock the cache on integer overflow
Diffstat (limited to 'src/pack-objects.c')
-rw-r--r--src/pack-objects.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/src/pack-objects.c b/src/pack-objects.c
index 67d6125ff..f644520ac 100644
--- a/src/pack-objects.c
+++ b/src/pack-objects.c
@@ -832,13 +832,14 @@ static int try_delta(git_packbuilder *pb, struct unpacked *trg,
trg_object->delta_data = NULL;
}
if (delta_cacheable(pb, src_size, trg_size, delta_size)) {
- if (git__add_uint64_overflow(&pb->delta_cache_size, pb->delta_cache_size, delta_size))
- return -1;
+ bool overflow = git__add_uint64_overflow(
+ &pb->delta_cache_size, pb->delta_cache_size, delta_size);
git_packbuilder__cache_unlock(pb);
- trg_object->delta_data = git__realloc(delta_buf, delta_size);
- GITERR_CHECK_ALLOC(trg_object->delta_data);
+ if (overflow ||
+ !(trg_object->delta_data = git__realloc(delta_buf, delta_size)))
+ return -1;
} else {
/* create delta when writing the pack */
git_packbuilder__cache_unlock(pb);