From 0971b47b11a6ea0fd97c3199a40c45ad869021e3 Mon Sep 17 00:00:00 2001 From: Stefan Kalkowski Date: Thu, 10 May 2012 15:48:05 +0200 Subject: [PATCH] Use placement new for Heap::Dataspace (fix #203) This commit introduces placement new/delete, and a constructor for Heap::Dataspace objects. It fixes the usage of uninitialized Dataspace objects when expanding the heap that lead to problems in conjunction with Native_capability smart-pointer in base-foc. Please refer to issue #203. --- base/include/base/heap.h | 7 +++++++ base/src/base/heap/heap.cc | 5 ++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/base/include/base/heap.h b/base/include/base/heap.h index 14e4efb4b..f18a2c0d4 100644 --- a/base/include/base/heap.h +++ b/base/include/base/heap.h @@ -43,6 +43,13 @@ namespace Genode { Ram_dataspace_capability cap; void *local_addr; + + Dataspace(Ram_dataspace_capability c, void *a) + : cap(c), local_addr(a) {} + + inline void * operator new(Genode::size_t, void* addr) { + return addr; } + inline void operator delete(void*) { } }; class Dataspace_pool : public List diff --git a/base/src/base/heap/heap.cc b/base/src/base/heap/heap.cc index 9e859182d..1f44ebe3b 100644 --- a/base/src/base/heap/heap.cc +++ b/base/src/base/heap/heap.cc @@ -34,6 +34,7 @@ Heap::Dataspace_pool::~Dataspace_pool() Ram_dataspace_capability ds_cap = ds->cap; remove(ds); + delete ds; _rm_session->detach(ds->local_addr); _ram_session->free(ds_cap); } @@ -66,9 +67,7 @@ int Heap::Dataspace_pool::expand(size_t size, Range_allocator *alloc) } /* add dataspace information to list of dataspaces */ - Dataspace *ds = reinterpret_cast(ds_addr); - ds->cap = new_ds_cap; - ds->local_addr = local_addr; + Dataspace *ds = new (ds_addr) Dataspace(new_ds_cap, local_addr); insert(ds); return 0;