Skip to content

Commit 31c375d

Browse files
committed
fix android build, add random mmap addr hint
1 parent 931a2c9 commit 31c375d

6 files changed

Lines changed: 52 additions & 16 deletions

File tree

Makefile

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,9 @@ EXPERIMENTAL = -DEXPERIMENTAL=0
120120
DEBUG_LOG_FLAGS = -DDEBUG=1 -DLEAK_DETECTOR=1 -DMEM_USAGE=1
121121

122122
## On Android we use prctl to name mappings so they are
123-
## visible in /proc/pid/maps
124-
NAMED_MAPPINGS = -DNAMED_MAPPINGS=1
123+
## visible in /proc/pid/maps - But the Android build does
124+
## not use this Makefile. You want to modify Android.mk
125+
NAMED_MAPPINGS = -DNAMED_MAPPINGS=0
125126

126127
UNAME := $(shell uname)
127128
ifeq ($(UNAME), Darwin)

android/jni/Android.mk

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
LOCAL_PATH := $(call my-dir)
22
include $(CLEAR_VARS)
33

4-
APP_CFLAGS := -DTHREAD_SUPPORT=1 -pthread -DTHREAD_ZONE_CACHE=1 \
4+
LOCAL_CFLAGS := -DTHREAD_SUPPORT=1 -pthread -DTHREAD_ZONE_CACHE=1 \
55
-DPRE_POPULATE_PAGES=0 -DSMALL_MEM_STARTUP=0 -DSANITIZE_CHUNKS=0 \
66
-DFUZZ_MODE=0 -DPERM_FREE_REALLOC=0 -DDISABLE_CANARY=0 -Werror \
77
-pedantic -Wno-pointer-arith -Wno-gnu-zero-variadic-macro-arguments \
88
-Wno-format-pedantic -DMALLOC_HOOK=1 -fvisibility=hidden -std=c11 \
99
-DALLOC_SANITY=0 -DUNINIT_READ_SANITY=0 -DCPU_PIN=0 -DEXPERIMENTAL=0 \
1010
-DUAF_PTR_PAGE=0 -DVERIFY_BIT_SLOT_CACHE=0 -DNAMED_MAPPINGS=1 -fPIC \
11-
-DNAMED_MAPPING=1 -shared -DDEBUG=1 -DLEAK_DETECTOR=1 -DMEM_USAGE=1 \
11+
-shared -DDEBUG=1 -DLEAK_DETECTOR=1 -DMEM_USAGE=1 \
1212
-g -ggdb3 -fno-omit-frame-pointer
1313

1414
LOCAL_SRC_FILES := ../../src/iso_alloc.c ../../src/iso_alloc_printf.c ../../src/iso_alloc_random.c \

include/iso_alloc_internal.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,26 @@
185185

186186
#define ALIGNMENT 8
187187

188+
#if NAMED_MAPPINGS
189+
#define SAMPLED_ALLOC_NAME "isoalloc sampled allocation"
190+
#define BIG_ZONE_UD_NAME "isoalloc big zone user data"
191+
#define BIG_ZONE_MD_NAME "isoalloc big zone metadata"
192+
#define GUARD_PAGE_NAME "guard page"
193+
#define ROOT_NAME "isoalloc root"
194+
#define ZONE_BITMAP_NAME "isoalloc zone bitmap"
195+
#define INTERNAL_UZ_NAME "internal isoalloc user zone"
196+
#define CUSTOM_UZ_NAME "custom isoalloc user zone"
197+
#else
198+
#define SAMPLED_ALLOC_NAME ""
199+
#define BIG_ZONE_UD_NAME ""
200+
#define BIG_ZONE_MD_NAME ""
201+
#define GUARD_PAGE_NAME ""
202+
#define ROOT_NAME ""
203+
#define ZONE_BITMAP_NAME ""
204+
#define INTERNAL_UZ_NAME ""
205+
#define CUSTOM_UZ_NAME ""
206+
#endif
207+
188208
#define WHICH_BIT(bit_slot) \
189209
(bit_slot & (BITS_PER_QWORD - 1))
190210

src/iso_alloc.c

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ INTERNAL_HIDDEN INLINE void iso_clear_user_chunk(uint8_t *p, size_t size) {
254254

255255
INTERNAL_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+
271272
INTERNAL_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);

src/iso_alloc_sanity.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ INTERNAL_HIDDEN void *_iso_alloc_sample(size_t size) {
220220
}
221221

222222
sane_alloc->orig_size = size;
223-
void *p = mmap_rw_pages(g_page_size * 3, false);
223+
void *p = mmap_rw_pages(g_page_size * 3, false, SAMPLED_ALLOC_NAME);
224224

225225
if(p == NULL) {
226226
LOG_AND_ABORT("Cannot allocate pages for sampled allocation");

src/malloc_hook.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,15 @@ EXTERNAL_API void *memalign(size_t alignment, size_t s) {
7070
return iso_alloc(s);
7171
}
7272

73+
#if __ANDROID__
74+
EXTERNAL_API size_t malloc_usable_size(const void *ptr) {
75+
return iso_chunksz((void *)ptr);
76+
}
77+
#else
7378
EXTERNAL_API size_t malloc_usable_size(void *ptr) {
7479
return iso_chunksz(ptr);
7580
}
81+
#endif
7682

7783
static void *libc_malloc(size_t s, const void *caller) {
7884
return iso_alloc(s);

0 commit comments

Comments
 (0)