svm: asan: fix asan support 37/26637/2
authorBenoît Ganne <bganne@cisco.com>
Mon, 20 Apr 2020 07:52:39 +0000 (09:52 +0200)
committerFlorin Coras <florin.coras@gmail.com>
Wed, 22 Apr 2020 17:11:56 +0000 (17:11 +0000)
 - 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>
src/plugins/unittest/svm_fifo_test.c
src/svm/ssvm.c
src/svm/svm.c

index 87b85da..ccaffa1 100644 (file)
@@ -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"))
index 0305278..073bc0b 100644 (file)
@@ -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);
index 6249a34..20f4b7a 100644 (file)
@@ -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)