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 <rv@xxxxxxxxxxxxxxxxxx> --- 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