summary refs log tree commit diff
path: root/tree-diff.c
diff options
context:
space:
mode:
authorJeff King <peff@peff.net>2016-02-19 06:21:30 -0500
committerJunio C Hamano <gitster@pobox.com>2016-02-19 09:40:37 -0800
commit5b442c4f2723211ce0d862571e88ee206bfd51bf (patch)
treea699d4fdd632c01c0a0bd29a59e490d112aede43 /tree-diff.c
parent320d0b493a259db3b481f985545b244438e6c086 (diff)
tree-diff: catch integer overflow in combine_diff_path allocation
A combine_diff_path struct has two "flex" members allocated
alongside the struct: a string to hold the pathname, and an
array of parent pointers. We use an "int" to compute this,
meaning we may easily overflow it if the pathname is
extremely long.

We can fix this by using size_t, and checking for overflow
with the st_add helper.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'tree-diff.c')
-rw-r--r--tree-diff.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/tree-diff.c b/tree-diff.c
index 290a1da4ce..4dda9a14ab 100644
--- a/tree-diff.c
+++ b/tree-diff.c
@@ -124,8 +124,8 @@ static struct combine_diff_path *path_appendnew(struct combine_diff_path *last,
 	unsigned mode, const unsigned char *sha1)
 {
 	struct combine_diff_path *p;
-	int len = base->len + pathlen;
-	int alloclen = combine_diff_path_size(nparent, len);
+	size_t len = st_add(base->len, pathlen);
+	size_t alloclen = combine_diff_path_size(nparent, len);
 
 	/* if last->next is !NULL - it is a pre-allocated memory, we can reuse */
 	p = last->next;