vppinfra: fix map_lock issue 84/34784/2
authorliuyacan <liuyacan@corp.netease.com>
Wed, 22 Dec 2021 08:41:21 +0000 (16:41 +0800)
committerDamjan Marion <dmarion@me.com>
Wed, 22 Dec 2021 15:19:12 +0000 (15:19 +0000)
The release of the map_lock is a bit too early, it needs to wrap
mprotect(), otherwise the access rights of hdr may be deprived of
other worker threads.

Type: fix

Signed-off-by: liuyacan <liuyacan@corp.netease.com>
Change-Id: I9cb89d49a097ec6d5ae9fd2af2bddf967ec946e9

src/vppinfra/linux/mem.c

index 3b752cf..6c3e036 100644 (file)
@@ -461,8 +461,6 @@ clib_mem_vm_map_internal (void *base, clib_mem_page_sz_t log2_page_sz,
   snprintf (hdr->name, CLIB_VM_MAP_HDR_NAME_MAX_LEN - 1, "%s", (char *) name);
   mm->last_map = hdr;
 
-  map_unlock ();
-
   hdr->base_addr = (uword) base;
   hdr->log2_page_sz = log2_page_sz;
   hdr->num_pages = size >> log2_page_sz;
@@ -470,6 +468,8 @@ clib_mem_vm_map_internal (void *base, clib_mem_page_sz_t log2_page_sz,
   hdr->name[CLIB_VM_MAP_HDR_NAME_MAX_LEN - 1] = 0;
   mprotect (hdr, sys_page_sz, PROT_NONE);
 
+  map_unlock ();
+
   CLIB_MEM_UNPOISON (base, size);
   return base;
 }