summaryrefslogtreecommitdiffstats
path: root/sys/kern/sysv_shm.c
diff options
context:
space:
mode:
authoralfred <alfred@FreeBSD.org>2001-05-20 20:37:47 +0000
committeralfred <alfred@FreeBSD.org>2001-05-20 20:37:47 +0000
commitcdb5d97b478a3e4f97dd6c0cd43105d0951daed5 (patch)
tree458517c8fe9db0339a6aca70dc360f2e95e0d614 /sys/kern/sysv_shm.c
parent79b7ca8187f3febc2214bf2336f498c3c4bb9471 (diff)
downloadFreeBSD-src-cdb5d97b478a3e4f97dd6c0cd43105d0951daed5.zip
FreeBSD-src-cdb5d97b478a3e4f97dd6c0cd43105d0951daed5.tar.gz
Aquire vm mutex when releasing sysv shm segments.
Obtained from: Dima Dorfman <dima@unixfreak.org>
Diffstat (limited to 'sys/kern/sysv_shm.c')
-rw-r--r--sys/kern/sysv_shm.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/sys/kern/sysv_shm.c b/sys/kern/sysv_shm.c
index 0a9abda..197791d 100644
--- a/sys/kern/sysv_shm.c
+++ b/sys/kern/sysv_shm.c
@@ -182,7 +182,9 @@ shm_deallocate_segment(shmseg)
size_t size;
shm_handle = shmseg->shm_internal;
+ mtx_lock(&vm_mtx);
vm_object_deallocate(shm_handle->shm_object);
+ mtx_unlock(&vm_mtx);
free((caddr_t)shm_handle, M_SHM);
shmseg->shm_internal = NULL;
size = round_page(shmseg->shm_segsz);
@@ -203,7 +205,9 @@ shm_delete_mapping(p, shmmap_s)
segnum = IPCID_TO_IX(shmmap_s->shmid);
shmseg = &shmsegs[segnum];
size = round_page(shmseg->shm_segsz);
+ mtx_lock(&vm_mtx);
result = vm_map_remove(&p->p_vmspace->vm_map, shmmap_s->va, shmmap_s->va + size);
+ mtx_unlock(&vm_mtx);
if (result != KERN_SUCCESS)
return EINVAL;
shmmap_s->shmid = -1;
OpenPOWER on IntegriCloud