From 0201b9002cfc5396e229fae2757a52cfb719e121 Mon Sep 17 00:00:00 2001 From: Hallvard Furuseth Date: Tue, 27 Nov 2012 23:56:47 +0100 Subject: [PATCH] Tweak MDB_FIXEDMAP handling. Drop mmap()'s MAP_FIXED flag, so it returns another address instead of unmapping existing overlapping pages. Verify the returned address. --- libraries/libmdb/mdb.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/libraries/libmdb/mdb.c b/libraries/libmdb/mdb.c index 6771829..32dbf63 100644 --- a/libraries/libmdb/mdb.c +++ b/libraries/libmdb/mdb.c @@ -2651,8 +2651,6 @@ mdb_env_open2(MDB_env *env) } #else i = MAP_SHARED; - if (meta.mm_address && (flags & MDB_FIXEDMAP)) - i |= MAP_FIXED; prot = PROT_READ; if (flags & MDB_WRITEMAP) { prot |= PROT_WRITE; @@ -2674,6 +2672,13 @@ mdb_env_open2(MDB_env *env) if (i != MDB_SUCCESS) { return i; } + } else if (meta.mm_address && env->me_map != meta.mm_address) { + /* Can happen because the address argument to mmap() is just a + * hint. mmap() can pick another, e.g. if the range is in use. + * The MAP_FIXED flag would prevent that, but then mmap could + * instead unmap existing pages to make room for the new map. + */ + return EBUSY; /* TODO: Make a new MDB_* error code? */ } env->me_psize = meta.mm_psize;