diff options
author | Benoît Ganne <bganne@cisco.com> | 2020-04-20 09:52:39 +0200 |
---|---|---|
committer | Florin Coras <florin.coras@gmail.com> | 2020-04-22 17:11:56 +0000 |
commit | 77d42fc7193fb3ffa9c6f2f9c6d4459493b8cff2 (patch) | |
tree | 3af006b7028bf8acd8569d94df54c10d7f4e453d | |
parent | 07bbaef593939e9d03ba131e03296587472514ce (diff) |
svm: asan: fix asan support
- restrict the unittests SVM address space to what is supported by ASan
- mark SVM mmap()ed address space accessible for ASan
- SVM shared memory heap scheme means some allocation can happen
outside the current process. Lazily mark those accessible for ASan
Type: fix
Change-Id: I7c196c80b2a5297651d0afa54f1a8e478fcf59b1
Signed-off-by: Benoît Ganne <bganne@cisco.com>
-rw-r--r-- | src/plugins/unittest/svm_fifo_test.c | 4 | ||||
-rw-r--r-- | src/svm/ssvm.c | 1 | ||||
-rw-r--r-- | src/svm/svm.c | 10 |
3 files changed, 13 insertions, 2 deletions
diff --git a/src/plugins/unittest/svm_fifo_test.c b/src/plugins/unittest/svm_fifo_test.c index 87b85da8951..ccaffa1f236 100644 --- a/src/plugins/unittest/svm_fifo_test.c +++ b/src/plugins/unittest/svm_fifo_test.c @@ -2710,8 +2710,8 @@ svm_fifo_test (vlib_main_t * vm, unformat_input_t * input, int res = 0; char *str; - clib_warning ("high mem %lu", HIGH_SEGMENT_BASEVA << 4); - fifo_segment_main_init (&segment_main, HIGH_SEGMENT_BASEVA << 4, 5); + clib_warning ("high mem %lu", HIGH_SEGMENT_BASEVA << 1); + fifo_segment_main_init (&segment_main, HIGH_SEGMENT_BASEVA << 1, 5); while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { if (unformat (input, "fifo1")) diff --git a/src/svm/ssvm.c b/src/svm/ssvm.c index 0305278a6b6..073bc0b5403 100644 --- a/src/svm/ssvm.c +++ b/src/svm/ssvm.c @@ -97,6 +97,7 @@ ssvm_master_init_shm (ssvm_private_t * ssvm) close (ssvm_fd); sh = mapa.addr; + CLIB_MEM_UNPOISON (sh, sizeof (*sh)); sh->master_pid = ssvm->my_pid; sh->ssvm_size = ssvm->ssvm_size; sh->ssvm_va = pointer_to_uword (sh); diff --git a/src/svm/svm.c b/src/svm/svm.c index 6249a342be2..20f4b7a6e7a 100644 --- a/src/svm/svm.c +++ b/src/svm/svm.c @@ -329,6 +329,7 @@ svm_data_region_create (svm_map_region_args_t * a, svm_region_t * rp) return -3; } close (fd); + CLIB_MEM_UNPOISON (rp->data_base, map_size); rp->backing_file = (char *) format (0, "%s\0", a->backing_file); rp->flags |= SVM_FLAGS_FILE; } @@ -414,6 +415,7 @@ svm_data_region_map (svm_map_region_args_t * a, svm_region_t * rp) return -3; } close (fd); + CLIB_MEM_UNPOISON (rp->data_base, map_size); } return 0; } @@ -607,6 +609,7 @@ svm_map_region (svm_map_region_args_t * a) return (0); } close (svm_fd); + CLIB_MEM_UNPOISON (rp, a->size); svm_region_init_mapped_region (a, rp); @@ -663,6 +666,9 @@ svm_map_region (svm_map_region_args_t * a) clib_warning ("mmap"); return (0); } + + CLIB_MEM_UNPOISON (rp, MMAP_PAGESIZE); + /* * We lost the footrace to create this region; make sure * the winner has crossed the finish line. @@ -699,6 +705,8 @@ svm_map_region (svm_map_region_args_t * a) close (svm_fd); + CLIB_MEM_UNPOISON (rp, a->size); + if ((uword) rp != rp->virtual_base) { clib_warning ("mmap botch"); @@ -1042,6 +1050,7 @@ svm_region_unmap_internal (void *rp_arg, u8 is_client) oldheap = svm_push_pvt_heap (rp); /* nb vec_delete() in the loop */ /* Remove the caller from the list of mappers */ + CLIB_MEM_UNPOISON (rp->client_pids, vec_bytes (rp->client_pids)); for (i = 0; i < vec_len (rp->client_pids); i++) { if (rp->client_pids[i] == mypid) @@ -1174,6 +1183,7 @@ svm_region_exit_internal (u8 is_client) virtual_base = root_rp->virtual_base; virtual_size = root_rp->virtual_size; + CLIB_MEM_UNPOISON (root_rp->client_pids, vec_bytes (root_rp->client_pids)); for (i = 0; i < vec_len (root_rp->client_pids); i++) { if (root_rp->client_pids[i] == mypid) |