From bbeab0479ccc94e9067c43bcf48615278ea590ca Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Thu, 1 Oct 2020 16:52:30 +0200 Subject: [PATCH] virBitmapNewQuiet: Don't fail on unlikely overflow scenario MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Modify the condition which would make virBitmapNewQuiet fail to possibly overallocate by 1 rather than failing. Signed-off-by: Peter Krempa Reviewed-by: Ján Tomko --- src/util/virbitmap.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/util/virbitmap.c b/src/util/virbitmap.c index ddcaddc872..68f44062f2 100644 --- a/src/util/virbitmap.c +++ b/src/util/virbitmap.c @@ -55,8 +55,7 @@ struct _virBitmap { * * Allocate a bitmap capable of containing @size bits. * - * Returns a pointer to the allocated bitmap or NULL if memory cannot be - * allocated. Does not report libvirt errors. + * Returns a pointer to the allocated bitmap. */ virBitmapPtr virBitmapNewQuiet(size_t size) @@ -64,10 +63,13 @@ virBitmapNewQuiet(size_t size) virBitmapPtr bitmap; size_t sz; - if (SIZE_MAX - VIR_BITMAP_BITS_PER_UNIT < size) - return NULL; - - sz = VIR_DIV_UP(size, VIR_BITMAP_BITS_PER_UNIT); + if (SIZE_MAX - VIR_BITMAP_BITS_PER_UNIT < size) { + /* VIR_DIV_UP would overflow, let's overallocate by 1 entry instead of + * the potential overflow */ + sz = (size / VIR_BITMAP_BITS_PER_UNIT) + 1; + } else { + sz = VIR_DIV_UP(size, VIR_BITMAP_BITS_PER_UNIT); + } bitmap = g_new0(virBitmap, 1); -- 2.47.2