X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Fbigalloc.c;h=a1060e60be7d3cb7185bfff87b4f4c92aa33083f;hb=8c48090e240d68564c79eb29ac9004cc911bb5d0;hp=3749fc9c89cdf331f591a5a3247da44696475fce;hpb=c757ef9998dbda90063206e399d471d96b9fde4a;p=libucw.git diff --git a/lib/bigalloc.c b/lib/bigalloc.c index 3749fc9c..a1060e60 100644 --- a/lib/bigalloc.c +++ b/lib/bigalloc.c @@ -1,7 +1,7 @@ /* * UCW Library -- Allocation of Large Aligned Buffers * - * (c) 2006 Martin Mares + * (c) 2006--2007 Martin Mares * (c) 2007 Pavel Charvat * * This software may be freely distributed and used according to the terms @@ -12,19 +12,22 @@ #include #include +#include void * -page_alloc(unsigned int len) +page_alloc(u64 len) { + if (len > SIZE_MAX) + die("page_alloc: Size %llu is too large for the current architecture", (long long) len); ASSERT(!(len & (CPU_PAGE_SIZE-1))); byte *p = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); if (p == (byte*) MAP_FAILED) - die("Cannot mmap %d bytes of memory: %m", len); + die("Cannot mmap %llu bytes of memory: %m", (long long)len); return p; } void -page_free(void *start, unsigned int len) +page_free(void *start, u64 len) { ASSERT(!(len & (CPU_PAGE_SIZE-1))); ASSERT(!((uintptr_t) start & (CPU_PAGE_SIZE-1))); @@ -32,7 +35,7 @@ page_free(void *start, unsigned int len) } void * -page_realloc(void *start, unsigned int old_len, unsigned int new_len) +page_realloc(void *start, u64 old_len, u64 new_len) { void *p = page_alloc(new_len); memcpy(p, start, MIN(old_len, new_len)); @@ -40,16 +43,18 @@ page_realloc(void *start, unsigned int old_len, unsigned int new_len) return p; } -static unsigned int -big_round(unsigned int len) +static u64 +big_round(u64 len) { - return ALIGN_TO(len, CPU_PAGE_SIZE); + return ALIGN_TO(len, (u64)CPU_PAGE_SIZE); } void * -big_alloc(unsigned int len) +big_alloc(u64 len) { len = big_round(len); + if (len > SIZE_MAX - 2*CPU_PAGE_SIZE) + die("big_alloc: Size %llu is too large for the current architecture", (long long) len); #ifdef CONFIG_DEBUG len += 2*CPU_PAGE_SIZE; #endif @@ -63,7 +68,7 @@ big_alloc(unsigned int len) } void -big_free(void *start, unsigned int len) +big_free(void *start, u64 len) { byte *p = start; len = big_round(len);