[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH] lib/ukalloc: fix multiple unsigned overflows
+ make sure realsize does not overflow in uk_malloc_ifpages and uk_posix_memalign_ifpages. + make sure to not overflow when converting the number of pages to a size in bytes in uk_palloc_compat. + make sure to not overflow when computing array size in uk_calloc_compat. POSIX is not very clear about this, but both OpenBSD and Linux do check this. size_t and ulong overflows are unsigned overflows, thus well defined. We can check for overflow via new_value < value. Signed-off-by: Hugo Lefeuvre <hugo.lefeuvre@xxxxxxxxx> --- lib/ukalloc/alloc.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/ukalloc/alloc.c b/lib/ukalloc/alloc.c index 2d16057..c0c9730 100644 --- a/lib/ukalloc/alloc.c +++ b/lib/ukalloc/alloc.c @@ -169,7 +169,8 @@ void *uk_malloc_ifpages(struct uk_alloc *a, size_t size) size_t realsize = sizeof(*metadata) + size; UK_ASSERT(a); - if (!size) + /* check for invalid size and overflow */ + if (!size || realsize < size) return NULL; num_pages = size_to_num_pages(realsize); @@ -271,6 +272,11 @@ int uk_posix_memalign_ifpages(struct uk_alloc *a, * order to be sure to find an aligned pointer preceding `size` bytes. */ realsize = size + padding + align; + + /* check for overflow */ + if (realsize < size) + return EINVAL; + num_pages = size_to_num_pages(realsize); intptr = (uintptr_t) uk_palloc(a, num_pages); @@ -282,7 +288,7 @@ int uk_posix_memalign_ifpages(struct uk_alloc *a, metadata = uk_get_metadata(*memptr); - /* check for underflow */ + /* check for underflow (should not happen) */ UK_ASSERT(intptr <= (uintptr_t) metadata); metadata->num_pages = num_pages; @@ -308,6 +314,10 @@ void *uk_palloc_compat(struct uk_alloc *a, unsigned long num_pages) UK_ASSERT(a); + /* check for overflow */ + if (num_pages > (~(size_t)0)/__PAGE_SIZE) + return NULL; + if (uk_posix_memalign(a, &ptr, __PAGE_SIZE, num_pages * __PAGE_SIZE)) return NULL; @@ -342,6 +352,10 @@ void *uk_calloc_compat(struct uk_alloc *a, size_t nmemb, size_t size) void *ptr; size_t tlen = nmemb * size; + /* check for overflow */ + if (nmemb > (~(size_t)0)/size) + return NULL; + UK_ASSERT(a); ptr = uk_malloc(a, tlen); if (!ptr) -- 2.24.1 Attachment:
signature.asc _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |