Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Jeff King authored and Junio C Hamano committed Feb 19, 2016
1 parent 320d0b4 commit 5b442c4
Show file tree
Hide file tree
Showing 2 changed files with 4 additions and 4 deletions.
4 changes: 2 additions & 2 deletions diff.h
Expand Up @@ -222,8 +222,8 @@ struct combine_diff_path {
} parent[FLEX_ARRAY];
};
#define combine_diff_path_size(n, l) \
(sizeof(struct combine_diff_path) + \
sizeof(struct combine_diff_parent) * (n) + (l) + 1)
st_add4(sizeof(struct combine_diff_path), (l), 1, \
st_mult(sizeof(struct combine_diff_parent), (n)))

extern void show_combined_diff(struct combine_diff_path *elem, int num_parent,
int dense, struct rev_info *);
Expand Down
4 changes: 2 additions & 2 deletions tree-diff.c
Expand Up @@ -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;
Expand Down

0 comments on commit 5b442c4

Please sign in to comment.