Skip to content

Commit

Permalink
harden REALLOC_ARRAY and xcalloc against size_t overflow
Browse files Browse the repository at this point in the history
REALLOC_ARRAY inherently involves a multiplication which can
overflow size_t, resulting in a much smaller buffer than we
think we've allocated. We can easily harden it by using
st_mult() to check for overflow.  Likewise, we can add
ALLOC_ARRAY to do the same thing for xmalloc calls.

xcalloc() should already be fine, because it takes the two
factors separately, assuming the system calloc actually
checks for overflow. However, before we even hit the system
calloc(), we do our memory_limit_check, which involves a
multiplication. Let's check for overflow ourselves so that
this limit cannot be bypassed.

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 22, 2016
1 parent 5b442c4 commit e7792a7
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 1 deletion.
3 changes: 2 additions & 1 deletion git-compat-util.h
Original file line number Diff line number Diff line change
Expand Up @@ -779,7 +779,8 @@ extern int odb_pack_keep(char *name, size_t namesz, const unsigned char *sha1);
extern char *xgetcwd(void);
extern FILE *fopen_for_writing(const char *path);

#define REALLOC_ARRAY(x, alloc) (x) = xrealloc((x), (alloc) * sizeof(*(x)))
#define ALLOC_ARRAY(x, alloc) (x) = xmalloc(st_mult(sizeof(*(x)), (alloc)))
#define REALLOC_ARRAY(x, alloc) (x) = xrealloc((x), st_mult(sizeof(*(x)), (alloc)))

static inline char *xstrdup_or_null(const char *str)
{
Expand Down
3 changes: 3 additions & 0 deletions wrapper.c
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,9 @@ void *xcalloc(size_t nmemb, size_t size)
{
void *ret;

if (unsigned_mult_overflows(nmemb, size))
die("data too large to fit into virtual memory space");

memory_limit_check(size * nmemb, 0);
ret = calloc(nmemb, size);
if (!ret && (!nmemb || !size))
Expand Down

0 comments on commit e7792a7

Please sign in to comment.