summaryrefslogtreecommitdiff
path: root/lib/libutils/isoc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libutils/isoc')
-rw-r--r--lib/libutils/isoc/bget_malloc.c26
1 files changed, 17 insertions, 9 deletions
diff --git a/lib/libutils/isoc/bget_malloc.c b/lib/libutils/isoc/bget_malloc.c
index 477cf42f..9aaf9b97 100644
--- a/lib/libutils/isoc/bget_malloc.c
+++ b/lib/libutils/isoc/bget_malloc.c
@@ -312,7 +312,7 @@ static void *raw_malloc(size_t hdr_size, size_t ftr_size, size_t pl_size,
struct bpoolset *poolset)
{
void *ptr = NULL;
- size_t s = hdr_size + ftr_size + pl_size;
+ bufsize s;
/*
* Make sure that malloc has correct alignment of returned buffers.
@@ -323,8 +323,10 @@ static void *raw_malloc(size_t hdr_size, size_t ftr_size, size_t pl_size,
raw_malloc_validate_pools();
- /* Check wrapping */
- if (s < pl_size)
+ /* Compute total size */
+ if (ADD_OVERFLOW(pl_size, hdr_size, &s))
+ goto out;
+ if (ADD_OVERFLOW(s, ftr_size, &s))
goto out;
/* BGET doesn't like 0 sized allocations */
@@ -349,13 +351,17 @@ static void raw_free(void *ptr, struct bpoolset *poolset)
static void *raw_calloc(size_t hdr_size, size_t ftr_size, size_t pl_nmemb,
size_t pl_size, struct bpoolset *poolset)
{
- size_t s = hdr_size + ftr_size + pl_nmemb * pl_size;
void *ptr = NULL;
+ bufsize s;
raw_malloc_validate_pools();
- /* Check wrapping */
- if (s < pl_nmemb || s < pl_size)
+ /* Compute total size */
+ if (MUL_OVERFLOW(pl_nmemb, pl_size, &s))
+ goto out;
+ if (ADD_OVERFLOW(s, hdr_size, &s))
+ goto out;
+ if (ADD_OVERFLOW(s, ftr_size, &s))
goto out;
/* BGET doesn't like 0 sized allocations */
@@ -372,11 +378,13 @@ out:
static void *raw_realloc(void *ptr, size_t hdr_size, size_t ftr_size,
size_t pl_size, struct bpoolset *poolset)
{
- size_t s = hdr_size + ftr_size + pl_size;
void *p = NULL;
+ bufsize s;
- /* Check wrapping */
- if (s < pl_size)
+ /* Compute total size */
+ if (ADD_OVERFLOW(pl_size, hdr_size, &s))
+ goto out;
+ if (ADD_OVERFLOW(s, ftr_size, &s))
goto out;
raw_malloc_validate_pools();