@@ -254,7 +254,7 @@ INTERNAL_HIDDEN INLINE void iso_clear_user_chunk(uint8_t *p, size_t size) {
254254
255255INTERNAL_HIDDEN void * create_guard_page (void * p ) {
256256 if (p == NULL ) {
257- p = mmap_rw_pages (g_page_size , false, "guard page" );
257+ p = mmap_rw_pages (g_page_size , false, GUARD_PAGE_NAME );
258258
259259 if (p == NULL ) {
260260 LOG_AND_ABORT ("Could not allocate guard page" );
@@ -268,19 +268,28 @@ INTERNAL_HIDDEN void *create_guard_page(void *p) {
268268 return p ;
269269}
270270
271+
271272INTERNAL_HIDDEN void * mmap_rw_pages (size_t size , bool populate , const char * name ) {
272- size = ROUND_UP_PAGE (size );
273+ #if !ENABLE_ASAN
274+ /* Produce a random page address as a hint for mmap */
275+ uint64_t hint = ROUND_DOWN_PAGE (rand_uint64 ());
276+ hint &= 0x3FFFFFFFF000 ;
277+ void * p = (void * ) hint ;
278+ #else
273279 void * p = NULL ;
280+ #endif
281+
282+ size = ROUND_UP_PAGE (size );
274283
275284 /* Only Linux supports MAP_POPULATE */
276285#if __linux__ && PRE_POPULATE_PAGES
277286 if (populate == true) {
278- p = mmap (0 , size , PROT_READ | PROT_WRITE , MAP_PRIVATE | MAP_ANONYMOUS | MAP_POPULATE , -1 , 0 );
287+ p = mmap (p , size , PROT_READ | PROT_WRITE , MAP_PRIVATE | MAP_ANONYMOUS | MAP_POPULATE , -1 , 0 );
279288 } else {
280- p = mmap (0 , size , PROT_READ | PROT_WRITE , MAP_PRIVATE | MAP_ANONYMOUS , -1 , 0 );
289+ p = mmap (p , size , PROT_READ | PROT_WRITE , MAP_PRIVATE | MAP_ANONYMOUS , -1 , 0 );
281290 }
282291#else
283- p = mmap (0 , size , PROT_READ | PROT_WRITE , MAP_PRIVATE | MAP_ANONYMOUS , -1 , 0 );
292+ p = mmap (p , size , PROT_READ | PROT_WRITE , MAP_PRIVATE | MAP_ANONYMOUS , -1 , 0 );
284293#endif
285294
286295 if (p == MAP_FAILED ) {
@@ -309,7 +318,7 @@ INTERNAL_HIDDEN iso_alloc_root *iso_alloc_new_root(void) {
309318
310319 size_t _root_size = sizeof (iso_alloc_root ) + (g_page_size << 1 );
311320
312- p = (void * ) mmap_rw_pages (_root_size , true, "isoalloc root" );
321+ p = (void * ) mmap_rw_pages (_root_size , true, ROOT_NAME );
313322
314323 if (p == NULL ) {
315324 LOG_AND_ABORT ("Cannot allocate pages for root" );
@@ -595,7 +604,7 @@ INTERNAL_HIDDEN iso_alloc_zone *_iso_new_zone(size_t size, bool internal) {
595604
596605 /* All of the following fields are immutable
597606 * and should not change once they are set */
598- void * p = mmap_rw_pages (new_zone -> bitmap_size + (_root -> system_page_size << 1 ), true, "isoalloc zone bitmap" );
607+ void * p = mmap_rw_pages (new_zone -> bitmap_size + (_root -> system_page_size << 1 ), true, ZONE_BITMAP_NAME );
599608
600609 void * bitmap_pages_guard_below = p ;
601610 new_zone -> bitmap_start = (p + _root -> system_page_size );
@@ -612,9 +621,9 @@ INTERNAL_HIDDEN iso_alloc_zone *_iso_new_zone(size_t size, bool internal) {
612621 char * name ;
613622
614623 if (internal == true) {
615- name = "internal isoalloc user zone" ;
624+ name = INTERNAL_UZ_NAME ;
616625 } else {
617- name = "custom isoalloc user zone" ;
626+ name = CUSTOM_UZ_NAME ;
618627 }
619628
620629 /* All user pages use MAP_POPULATE. This might seem like we are asking
@@ -873,14 +882,14 @@ INTERNAL_HIDDEN void *_iso_big_alloc(size_t size) {
873882 if (big == NULL ) {
874883 /* User data is allocated separately from big zone meta
875884 * data to prevent an attacker from targeting it */
876- void * user_pages = mmap_rw_pages ((_root -> system_page_size << BIG_ZONE_USER_PAGE_COUNT_SHIFT ) + size , false, "isoalloc big zone user data" );
885+ void * user_pages = mmap_rw_pages ((_root -> system_page_size << BIG_ZONE_USER_PAGE_COUNT_SHIFT ) + size , false, BIG_ZONE_UD_NAME );
877886
878887 if (user_pages == NULL ) {
879888 UNLOCK_BIG_ZONE ();
880889 return NULL ;
881890 }
882891
883- void * p = mmap_rw_pages ((_root -> system_page_size * BIG_ZONE_META_DATA_PAGE_COUNT ), false, "isoalloc big zone metadata" );
892+ void * p = mmap_rw_pages ((_root -> system_page_size * BIG_ZONE_META_DATA_PAGE_COUNT ), false, BIG_ZONE_MD_NAME );
884893
885894 /* The first page before meta data is a guard page */
886895 create_guard_page (p );
0 commit comments