diff options
author | tjr <tjr@FreeBSD.org> | 2004-06-19 14:46:13 +0000 |
---|---|---|
committer | tjr <tjr@FreeBSD.org> | 2004-06-19 14:46:13 +0000 |
commit | 8fd212e66eb0a92687dd3836f196fe09430d2b87 (patch) | |
tree | 8943a14a629e067f107bc509b5ab941b1a8109cd /sys/kern/sysv_shm.c | |
parent | cc9134c9f2f5de0a1a42e600889f8bc949e7c8cf (diff) | |
download | FreeBSD-src-8fd212e66eb0a92687dd3836f196fe09430d2b87.zip FreeBSD-src-8fd212e66eb0a92687dd3836f196fe09430d2b87.tar.gz |
When no fixed address is given in a shmat() request, pass a hint address
to vm_map_find() that is less likely to be outside of addressable memory
for 32-bit processes: just past the end of the largest possible heap.
This is the same hint that mmap() uses.
Diffstat (limited to 'sys/kern/sysv_shm.c')
-rw-r--r-- | sys/kern/sysv_shm.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/sys/kern/sysv_shm.c b/sys/kern/sysv_shm.c index 6a57f4e..6486781 100644 --- a/sys/kern/sysv_shm.c +++ b/sys/kern/sysv_shm.c @@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$"); #include <sys/mman.h> #include <sys/module.h> #include <sys/mutex.h> +#include <sys/resourcevar.h> #include <sys/stat.h> #include <sys/syscall.h> #include <sys/syscallsubr.h> @@ -370,8 +371,10 @@ kern_shmat(td, shmid, shmaddr, shmflg) * This is just a hint to vm_map_find() about where to * put it. */ - attach_va = round_page((vm_offset_t)p->p_vmspace->vm_taddr - + maxtsiz + maxdsiz); + PROC_LOCK(p); + attach_va = round_page((vm_offset_t)p->p_vmspace->vm_daddr + + lim_max(p, RLIMIT_DATA)); + PROC_UNLOCK(p); } shm_handle = shmseg->shm_internal; |