Skip to content

Commit

Permalink
Add more large blob test cases
Browse files Browse the repository at this point in the history
New test cases list commands that should work when memory is
limited. All memory allocation functions (*) learn to reject any
allocation larger than $GIT_ALLOC_LIMIT if set.

(*) Not exactly all. Some places do not use x* functions, but
malloc/calloc directly, notably diff-delta. These code path should
never be run on large blobs.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Nguyễn Thái Ngọc Duy authored and Junio C Hamano committed Mar 7, 2012
1 parent 47a02ff commit d41489a
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 5 deletions.
38 changes: 36 additions & 2 deletions t/t1050-large.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,15 @@ test_description='adding and checking out large blobs'
. ./test-lib.sh

test_expect_success setup '
git config core.bigfilethreshold 200k &&
# clone does not allow us to pass core.bigfilethreshold to
# new repos, so set core.bigfilethreshold globally
git config --global core.bigfilethreshold 200k &&
echo X | dd of=large1 bs=1k seek=2000 &&
echo X | dd of=large2 bs=1k seek=2000 &&
echo X | dd of=large3 bs=1k seek=2000 &&
echo Y | dd of=huge bs=1k seek=2500
echo Y | dd of=huge bs=1k seek=2500 &&
GIT_ALLOC_LIMIT=1500 &&
export GIT_ALLOC_LIMIT
'

test_expect_success 'add a large file or two' '
Expand Down Expand Up @@ -100,4 +104,34 @@ test_expect_success 'packsize limit' '
)
'

test_expect_success 'diff --raw' '
git commit -q -m initial &&
echo modified >>large1 &&
git add large1 &&
git commit -q -m modified &&
git diff --raw HEAD^
'

test_expect_success 'hash-object' '
git hash-object large1
'

test_expect_failure 'cat-file a large file' '
git cat-file blob :large1 >/dev/null
'

test_expect_failure 'cat-file a large file from a tag' '
git tag -m largefile largefiletag :large1 &&
git cat-file blob largefiletag >/dev/null
'

test_expect_failure 'git-show a large file' '
git show :large1 >/dev/null
'

test_expect_failure 'repack' '
git repack -ad
'

test_done
27 changes: 24 additions & 3 deletions wrapper.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,18 @@ static void do_nothing(size_t size)

static void (*try_to_free_routine)(size_t size) = do_nothing;

static void memory_limit_check(size_t size)
{
static int limit = -1;
if (limit == -1) {
const char *env = getenv("GIT_ALLOC_LIMIT");
limit = env ? atoi(env) * 1024 : 0;
}
if (limit && size > limit)
die("attempting to allocate %"PRIuMAX" over limit %d",
(intmax_t)size, limit);
}

try_to_free_t set_try_to_free_routine(try_to_free_t routine)
{
try_to_free_t old = try_to_free_routine;
Expand All @@ -32,7 +44,10 @@ char *xstrdup(const char *str)

void *xmalloc(size_t size)
{
void *ret = malloc(size);
void *ret;

memory_limit_check(size);
ret = malloc(size);
if (!ret && !size)
ret = malloc(1);
if (!ret) {
Expand Down Expand Up @@ -79,7 +94,10 @@ char *xstrndup(const char *str, size_t len)

void *xrealloc(void *ptr, size_t size)
{
void *ret = realloc(ptr, size);
void *ret;

memory_limit_check(size);
ret = realloc(ptr, size);
if (!ret && !size)
ret = realloc(ptr, 1);
if (!ret) {
Expand All @@ -95,7 +113,10 @@ void *xrealloc(void *ptr, size_t size)

void *xcalloc(size_t nmemb, size_t size)
{
void *ret = calloc(nmemb, size);
void *ret;

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

0 comments on commit d41489a

Please sign in to comment.