Page MenuHomeFreeBSD

D40743.id123804.diff
No OneTemporary

D40743.id123804.diff

diff --git a/sys/vm/vm_map.h b/sys/vm/vm_map.h
--- a/sys/vm/vm_map.h
+++ b/sys/vm/vm_map.h
@@ -383,6 +383,7 @@
#define MAP_CREATE_STACK_GAP_DN 0x00020000
#define MAP_VN_EXEC 0x00040000
#define MAP_SPLIT_BOUNDARY_MASK 0x00180000
+#define MAP_NO_HINT 0x00200000
#define MAP_SPLIT_BOUNDARY_SHIFT 19
diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c
--- a/sys/vm/vm_map.c
+++ b/sys/vm/vm_map.c
@@ -1981,14 +1981,14 @@
"Cluster anonymous mappings: 0 = no, 1 = yes if no hint, 2 = always");
static bool
-clustering_anon_allowed(vm_offset_t addr)
+clustering_anon_allowed(vm_offset_t addr, int cow)
{
switch (cluster_anon) {
case 0:
return (false);
case 1:
- return (addr == 0);
+ return (addr == 0 || (cow & MAP_NO_HINT) != 0);
case 2:
default:
return (true);
@@ -2111,7 +2111,7 @@
} else
alignment = 0;
en_aslr = (map->flags & MAP_ASLR) != 0;
- update_anon = cluster = clustering_anon_allowed(*addr) &&
+ update_anon = cluster = clustering_anon_allowed(*addr, cow) &&
(map->flags & MAP_IS_SUB_MAP) == 0 && max_addr == 0 &&
find_space != VMFS_NO_SPACE && object == NULL &&
(cow & (MAP_INHERIT_SHARE | MAP_STACK_GROWS_UP |
@@ -2255,6 +2255,10 @@
int rv;
hint = *addr;
+ if (hint == 0)
+ cow |= MAP_NO_HINT;
+ if (hint < min_addr)
+ *addr = hint = min_addr;
for (;;) {
rv = vm_map_find(map, object, offset, addr, length, max_addr,
find_space, prot, max, cow);
diff --git a/sys/vm/vm_mmap.c b/sys/vm/vm_mmap.c
--- a/sys/vm/vm_mmap.c
+++ b/sys/vm/vm_mmap.c
@@ -353,10 +353,12 @@
* the hint would fall in the potential heap space,
* place it after the end of the largest possible heap.
*
- * There should really be a pmap call to determine a reasonable
- * location.
+ * For anonymous mappings within the address space of the
+ * calling process, the absence of a hint is handled at a
+ * lower level in order to implement different clustering
+ * strategies for ASLR.
*/
- if (addr == 0 ||
+ if (((flags & MAP_ANON) == 0 && addr == 0) ||
(addr >= round_page((vm_offset_t)vms->vm_taddr) &&
addr < round_page((vm_offset_t)vms->vm_daddr +
lim_max(td, RLIMIT_DATA))))

File Metadata

Mime Type
text/plain
Expires
Sat, Apr 18, 12:13 PM (12 h, 34 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31718539
Default Alt Text
D40743.id123804.diff (2 KB)

Event Timeline