summaryrefslogtreecommitdiffstats
path: root/sys/vm/vm_mmap.c
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2012-02-11 17:29:07 +0000
committerkib <kib@FreeBSD.org>2012-02-11 17:29:07 +0000
commitdacbfe950a81e3904fb15609934754d23432a328 (patch)
treee6a1bc83c2fa78afa49c7d25721b2e04105fc483 /sys/vm/vm_mmap.c
parent3e86e21237c556aca42212d457e89b7ca8c54064 (diff)
downloadFreeBSD-src-dacbfe950a81e3904fb15609934754d23432a328.zip
FreeBSD-src-dacbfe950a81e3904fb15609934754d23432a328.tar.gz
Close a race due to dropping of the map lock between creating map entry
for a shared mapping and marking the entry for inheritance. Other thread might execute vmspace_fork() in between (e.g. by fork(2)), resulting in the mapping becoming private. Noted and reviewed by: alc MFC after: 1 week
Diffstat (limited to 'sys/vm/vm_mmap.c')
-rw-r--r--sys/vm/vm_mmap.c10
1 files changed, 3 insertions, 7 deletions
diff --git a/sys/vm/vm_mmap.c b/sys/vm/vm_mmap.c
index e85b681..4b4996f 100644
--- a/sys/vm/vm_mmap.c
+++ b/sys/vm/vm_mmap.c
@@ -1517,6 +1517,9 @@ vm_mmap(vm_map_t map, vm_offset_t *addr, vm_size_t size, vm_prot_t prot,
docow |= MAP_DISABLE_SYNCER;
if (flags & MAP_NOCORE)
docow |= MAP_DISABLE_COREDUMP;
+ /* Shared memory is also shared with children. */
+ if (flags & MAP_SHARED)
+ docow |= MAP_INHERIT_SHARE;
if (flags & MAP_STACK)
rv = vm_map_stack(map, *addr, size, prot, maxprot,
@@ -1536,13 +1539,6 @@ vm_mmap(vm_map_t map, vm_offset_t *addr, vm_size_t size, vm_prot_t prot,
* or named anonymous without other references.
*/
vm_object_deallocate(object);
- } else if (flags & MAP_SHARED) {
- /*
- * Shared memory is also shared with children.
- */
- rv = vm_map_inherit(map, *addr, *addr + size, VM_INHERIT_SHARE);
- if (rv != KERN_SUCCESS)
- (void) vm_map_remove(map, *addr, *addr + size);
}
/*
OpenPOWER on IntegriCloud