I have no idea if this is a real issue, but it's not obvious to me that
paint_alloc cannot be called with info->nr_bits greater than about
4M (\approx 8*COMMIT_SLAB_SIZE). In that case the new slab would be too
small. So just round up the allocation to the maximum of
COMMIT_SLAB_SIZE and size.

Signed-off-by: Rasmus Villemoes <r...@rasmusvillemoes.dk>
---
 shallow.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/shallow.c b/shallow.c
index 4d0b005..e21534a 100644
--- a/shallow.c
+++ b/shallow.c
@@ -445,11 +445,13 @@ static uint32_t *paint_alloc(struct paint_info *info)
        unsigned size = nr * sizeof(uint32_t);
        void *p;
        if (!info->slab_count || info->free + size > info->end) {
+               unsigned alloc_size = size < COMMIT_SLAB_SIZE ?
+                       COMMIT_SLAB_SIZE : size;
                info->slab_count++;
                REALLOC_ARRAY(info->slab, info->slab_count);
-               info->free = xmalloc(COMMIT_SLAB_SIZE);
+               info->free = xmalloc(alloc_size);
                info->slab[info->slab_count - 1] = info->free;
-               info->end = info->free + COMMIT_SLAB_SIZE;
+               info->end = info->free + alloc_size;
        }
        p = info->free;
        info->free += size;
-- 
2.1.4

Reply via email to