xmalloc: guard against integer overflow

There are hypercall handling paths (EFI ones are what this was found
with) needing to allocate buffers of a caller specified size. This is
generally fine, as our page allocator enforces an upper bound on all
allocations. However, certain extremely large sizes could, when adding
in allocator overhead, result in an apparently tiny allocation size,
which would typically result in either a successful allocation, but a
severe buffer overrun when using that memory block, or in a crash right
in the allocator code.

Reported-by: Ilja Van Sprundel <ivansprundel@ioactive.com>
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: George Dunlap <george.dunlap@citrix.com>
master commit: cf38b4926e
master date: 2020-02-06 09:53:12 +0100
This commit is contained in:
Jan Beulich committed 2020-03-05 11:34:30 +01:00
1 parent 8348cc77e6
commit 2ffed5c92f
1 file changed
+15 -1
+15 -1
View File
@@ -388,7 +388,17 @@ void *xmem_pool_alloc(unsigned long size, struct xmem_pool *pool)
pool->init_region = region;
}
size = (size < MIN_BLOCK_SIZE) ? MIN_BLOCK_SIZE : ROUNDUP_SIZE(size);
if ( size < MIN_BLOCK_SIZE )
size = MIN_BLOCK_SIZE;
else
{
tmp_size = ROUNDUP_SIZE(size);
/* Guard against overflow. */
if ( tmp_size < size )
return NULL;
size = tmp_size;
}
/* Rounding up the requested size and calculating fl and sl */
spin_lock(&pool->lock);
@@ -583,6 +593,10 @@ void *_xmalloc(unsigned long size, unsigned long align)
align = MEM_ALIGN;
size += align - MEM_ALIGN;
/* Guard against overflow. */
if ( size < align - MEM_ALIGN )
return NULL;
if ( !xenpool )
tlsf_init();
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.