aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/sysv_shm.c
diff options
context:
space:
mode:
authorTim J. Robbins <tjr@FreeBSD.org>2004-06-19 14:46:13 +0000
committerTim J. Robbins <tjr@FreeBSD.org>2004-06-19 14:46:13 +0000
commit68ba7a1d573415e20579a52ca77534d567d033c0 (patch)
tree8943a14a629e067f107bc509b5ab941b1a8109cd /sys/kern/sysv_shm.c
parentfdbe285cb63011f77d6b451d3d9c7e5146ddec92 (diff)
downloadsrc-68ba7a1d573415e20579a52ca77534d567d033c0.tar.gz
src-68ba7a1d573415e20579a52ca77534d567d033c0.zip
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.
Notes
Notes: svn path=/head/; revision=130730
Diffstat (limited to 'sys/kern/sysv_shm.c')
-rw-r--r--sys/kern/sysv_shm.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/sys/kern/sysv_shm.c b/sys/kern/sysv_shm.c
index 6a57f4eaa448..64867812744a 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;