@@ -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);
257+ p = mmap_rw_pages (g_page_size , false, "guard page" );
258258
259259 if (p == NULL ) {
260260 LOG_AND_ABORT ("Could not allocate guard page" );
@@ -268,7 +268,7 @@ INTERNAL_HIDDEN void *create_guard_page(void *p) {
268268 return p ;
269269}
270270
271- INTERNAL_HIDDEN void * mmap_rw_pages (size_t size , bool populate ) {
271+ INTERNAL_HIDDEN void * mmap_rw_pages (size_t size , bool populate , const char * name ) {
272272 size = ROUND_UP_PAGE (size );
273273 void * p = NULL ;
274274
@@ -288,6 +288,10 @@ INTERNAL_HIDDEN void *mmap_rw_pages(size_t size, bool populate) {
288288 return NULL ;
289289 }
290290
291+ if (name != NULL ) {
292+ name_mapping (p , size , name );
293+ }
294+
291295 return p ;
292296}
293297
@@ -305,7 +309,7 @@ INTERNAL_HIDDEN iso_alloc_root *iso_alloc_new_root(void) {
305309
306310 size_t _root_size = sizeof (iso_alloc_root ) + (g_page_size << 1 );
307311
308- p = (void * ) mmap_rw_pages (_root_size , true);
312+ p = (void * ) mmap_rw_pages (_root_size , true, "isoalloc root" );
309313
310314 if (p == NULL ) {
311315 LOG_AND_ABORT ("Cannot allocate pages for root" );
@@ -340,11 +344,12 @@ INTERNAL_HIDDEN void iso_alloc_initialize_global_root(void) {
340344 _root -> zones_size = ROUND_UP_PAGE (_root -> zones_size );
341345
342346 /* Allocate memory with guard pages to hold zone data */
343- void * p = mmap_rw_pages (_root -> zones_size , false);
347+ void * p = mmap_rw_pages (_root -> zones_size , false, NULL );
344348 create_guard_page (p );
345349 create_guard_page ((void * ) (uintptr_t )(p + _root -> zones_size ) - g_page_size );
346350
347351 _root -> zones = (void * ) (p + g_page_size );
352+ name_mapping (p , _root -> zones_size , "isoalloc zone metadata" );
348353
349354 for (int64_t i = 0 ; i < _default_zone_count ; i ++ ) {
350355 if ((_iso_new_zone (default_zones [i ], true)) == NULL ) {
@@ -543,6 +548,13 @@ __attribute__((destructor(LAST_DTOR))) void iso_alloc_dtor(void) {
543548 UNLOCK_ROOT ();
544549}
545550
551+ INTERNAL_HIDDEN int32_t name_mapping (void * p , size_t sz , const char * name ) {
552+ #if NAMED_MAPPINGS && __ANDROID__
553+ return prctl (PR_SET_VMA , PR_SET_VMA_ANON_NAME , p , sz , name );
554+ #endif
555+ return 0 ;
556+ }
557+
546558INTERNAL_HIDDEN iso_alloc_zone * iso_new_zone (size_t size , bool internal ) {
547559 LOCK_ROOT ();
548560 iso_alloc_zone * zone = _iso_new_zone (size , internal );
@@ -583,7 +595,7 @@ INTERNAL_HIDDEN iso_alloc_zone *_iso_new_zone(size_t size, bool internal) {
583595
584596 /* All of the following fields are immutable
585597 * and should not change once they are set */
586- void * p = mmap_rw_pages (new_zone -> bitmap_size + (_root -> system_page_size << 1 ), true);
598+ void * p = mmap_rw_pages (new_zone -> bitmap_size + (_root -> system_page_size << 1 ), true, "isoalloc zone bitmap" );
587599
588600 void * bitmap_pages_guard_below = p ;
589601 new_zone -> bitmap_start = (p + _root -> system_page_size );
@@ -597,10 +609,18 @@ INTERNAL_HIDDEN iso_alloc_zone *_iso_new_zone(size_t size, bool internal) {
597609 madvise (new_zone -> bitmap_start , new_zone -> bitmap_size , MADV_WILLNEED );
598610 madvise (new_zone -> bitmap_start , new_zone -> bitmap_size , MADV_SEQUENTIAL );
599611
612+ char * name ;
613+
614+ if (internal == true) {
615+ name = "internal isoalloc user zone" ;
616+ } else {
617+ name = "custom isoalloc user zone" ;
618+ }
619+
600620 /* All user pages use MAP_POPULATE. This might seem like we are asking
601621 * the kernel to commit a lot of memory for us that we may never use
602622 * but when we call create_canary_chunks() that will happen anyway */
603- p = mmap_rw_pages (ZONE_USER_SIZE + (_root -> system_page_size << 1 ), true);
623+ p = mmap_rw_pages (ZONE_USER_SIZE + (_root -> system_page_size << 1 ), true, name );
604624
605625 void * user_pages_guard_below = p ;
606626 new_zone -> user_pages_start = (p + _root -> system_page_size );
@@ -853,14 +873,14 @@ INTERNAL_HIDDEN void *_iso_big_alloc(size_t size) {
853873 if (big == NULL ) {
854874 /* User data is allocated separately from big zone meta
855875 * data to prevent an attacker from targeting it */
856- void * user_pages = mmap_rw_pages ((_root -> system_page_size << BIG_ZONE_USER_PAGE_COUNT_SHIFT ) + size , false);
876+ void * user_pages = mmap_rw_pages ((_root -> system_page_size << BIG_ZONE_USER_PAGE_COUNT_SHIFT ) + size , false, "isoalloc big zone user data" );
857877
858878 if (user_pages == NULL ) {
859879 UNLOCK_BIG_ZONE ();
860880 return NULL ;
861881 }
862882
863- void * p = mmap_rw_pages ((_root -> system_page_size * BIG_ZONE_META_DATA_PAGE_COUNT ), false);
883+ void * p = mmap_rw_pages ((_root -> system_page_size * BIG_ZONE_META_DATA_PAGE_COUNT ), false, "isoalloc big zone metadata" );
864884
865885 /* The first page before meta data is a guard page */
866886 create_guard_page (p );
0 commit comments