Drop mmap()'s MAP_FIXED flag, so it returns another address instead
of unmapping existing overlapping pages. Verify the returned address.
}
#else
i = MAP_SHARED;
- if (meta.mm_address && (flags & MDB_FIXEDMAP))
- i |= MAP_FIXED;
prot = PROT_READ;
if (flags & MDB_WRITEMAP) {
prot |= PROT_WRITE;
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;