From: Hallvard Furuseth Date: Tue, 27 Nov 2012 22:56:47 +0000 (+0100) Subject: Tweak MDB_FIXEDMAP handling. X-Git-Tag: OPENLDAP_REL_ENG_2_4_34~103^2~12 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=0201b9002cfc5396e229fae2757a52cfb719e121;p=openldap 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. --- diff --git a/libraries/libmdb/mdb.c b/libraries/libmdb/mdb.c index 6771829152..32dbf63544 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;