Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F152849091
D40743.id123804.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D40743.id123804.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D40743: vm: Fix anonymous memory clustering under ASLR
Attached
Detach File
Event Timeline
Log In to Comment