Bug #514 ยป random-mmap.patch
sys/machine/pc32/include/vmparam.h 11 Jan 2007 17:37:58 -0000 | ||
---|---|---|
#define VM_PROT_READ_IS_EXEC /* if you can read -- then you can exec */
|
||
/* I386 has a line where all code is executable: 0 - I386_MAX_EXE_ADDR */
|
||
#define I386_MAX_EXE_ADDR 0x20000000 /* exec line */
|
||
/*
|
||
* Virtual memory related constants, all in bytes
|
||
*/
|
sys/sys/mman.h 11 Jan 2007 17:37:58 -0000 | ||
---|---|---|
#define MAP_HASSEMAPHORE 0x0200 /* region may contain semaphores */
|
||
#define MAP_STACK 0x0400 /* region grows down, like a stack */
|
||
#define MAP_NOSYNC 0x0800 /* page to but do not sync underlying file */
|
||
#define MAP_TRYFIXED 0x1000 /* attempt hint address, even within heap */
|
||
#ifdef _P1003_1B_VISIBLE
|
||
/*
|
sys/vm/vm_map.c 13 Jan 2007 12:59:26 -0000 | ||
---|---|---|
#include <sys/thread2.h>
|
||
#include <sys/random.h>
|
||
/*
|
||
* Virtual memory maps provide for the mapping, protection,
|
||
* and sharing of virtual memory objects. In addition,
|
||
... | ... | |
}
|
||
/*
|
||
* vm_map_hint: return the beginning of the best area suitable for
|
||
* creating a new mapping with "prot" protection.
|
||
*/
|
||
vm_offset_t
|
||
vm_map_hint(struct proc *p, vm_prot_t prot)
|
||
{
|
||
vm_offset_t addr;
|
||
#ifdef __i386__
|
||
/*
|
||
* If executable skip first two pages, otherwise start
|
||
* after data + heap region.
|
||
*/
|
||
if ((prot & VM_PROT_EXECUTE) &&
|
||
((vm_offset_t)p->p_vmspace->vm_daddr >= I386_MAX_EXE_ADDR)) {
|
||
addr = (PAGE_SIZE*2) +
|
||
(karc4random() & (I386_MAX_EXE_ADDR / 2 - 1));
|
||
return (round_page(addr));
|
||
}
|
||
#endif
|
||
addr = (vm_offset_t)p->p_vmspace->vm_daddr + MAXDSIZ;
|
||
addr += karc4random() & (MIN((256 * 1024 * 1024), MAXDSIZ) - 1);
|
||
return (round_page(addr));
|
||
}
|
||
/*
|
||
* vm_map_lookup_done:
|
||
*
|
||
* Releases locks acquired by a vm_map_lookup
|
sys/vm/vm_map.h 11 Jan 2007 17:37:58 -0000 | ||
---|---|---|
vm_prot_t, vm_prot_t,
|
||
int);
|
||
int vm_map_findspace (vm_map_t, vm_offset_t, vm_size_t, vm_offset_t, vm_offset_t *);
|
||
vm_offset_t vm_map_hint(struct proc *, vm_prot_t);
|
||
int vm_map_inherit (vm_map_t, vm_offset_t, vm_offset_t, vm_inherit_t);
|
||
void vm_map_init (struct vm_map *, vm_offset_t, vm_offset_t, pmap_t);
|
||
int vm_map_insert (vm_map_t, int *, vm_object_t, vm_ooffset_t,
|
sys/vm/vm_mmap.c 13 Jan 2007 10:17:31 -0000 | ||
---|---|---|
* There should really be a pmap call to determine a reasonable
|
||
* location.
|
||
*/
|
||
else if (addr == 0 ||
|
||
(addr >= round_page((vm_offset_t)vms->vm_taddr) &&
|
||
addr < round_page((vm_offset_t)vms->vm_daddr + maxdsiz)))
|
||
addr = round_page((vm_offset_t)vms->vm_daddr + maxdsiz);
|
||
else {
|
||
/*
|
||
* not fixed: make sure we skip over the largest possible heap.
|
||
* we will refine our guess later (e.g. to account for VAC, etc)
|
||
*/
|
||
if (addr == 0)
|
||
addr = vm_map_hint(p, prot);
|
||
else if (!(flags & MAP_TRYFIXED) &&
|
||
addr < (vm_offset_t)p->p_vmspace->vm_daddr)
|
||
addr = vm_map_hint(p, prot);
|
||
}
|
||
if (flags & MAP_ANON) {
|
||
/*
|