From 8950de5a8970ef34c51bd32ca48bfb9b691e7d22 Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Tue, 9 Apr 2019 13:02:01 +0200 Subject: [PATCH] base: support whole addressable range in allocator Issue #3111 --- repos/base/src/lib/base/allocator_avl.cc | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/repos/base/src/lib/base/allocator_avl.cc b/repos/base/src/lib/base/allocator_avl.cc index 6aeb7fcbf..a176db06a 100644 --- a/repos/base/src/lib/base/allocator_avl.cc +++ b/repos/base/src/lib/base/allocator_avl.cc @@ -146,8 +146,14 @@ void Allocator_avl_base::_destroy_block(Block *b) void Allocator_avl_base::_cut_from_block(Block *b, addr_t addr, size_t size, Block *dst1, Block *dst2) { - size_t padding = addr > b->addr() ? addr - b->addr() : 0; - size_t remaining = b->size() > (size + padding) ? b->size() - size - padding : 0; + size_t const padding = addr > b->addr() ? addr - b->addr() : 0; + size_t const b_size = b->size() > padding ? b->size() - padding : 0; + size_t remaining = b_size > size ? b_size - size : 0; + + /* case that a block contains the whole addressable range */ + if (!b->addr() && !b->size()) + remaining = b->size() - size - padding; + addr_t orig_addr = b->addr(); _destroy_block(b);