mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-11-01 06:46:35 +01:00
mm: vmalloc: avoid racy handling of debugobjects in vunmap
Currently, __vunmap flow is,
1) Release the VM area
2) Free the debug objects corresponding to that vm area.
This leave some race window open.
1) Release the VM area
1.5) Some other client gets the same vm area
1.6) This client allocates new debug objects on the same
vm area
2) Free the debug objects corresponding to this vm area.
Here, we actually free 'other' client's debug objects.
Fix this by freeing the debug objects first and then releasing the VM
area.
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Chintan Pandya <[email protected]>
Reviewed-by: Andrew Morton <[email protected]>
Cc: Ard Biesheuvel <[email protected]>
Cc: Byungchul Park <[email protected]>
Cc: Catalin Marinas <[email protected]>
Cc: Florian Fainelli <[email protected]>
Cc: Johannes Weiner <[email protected]>
Cc: Laura Abbott <[email protected]>
Cc: Vlastimil Babka <[email protected]>
Cc: Wei Yang <[email protected]>
Cc: Yisheng Xie <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
1 parent
82a2e924ff
commit
f3c01d2f3a
1 file changed
+2
-1
+2
-1
@@ -1504,7 +1504,7 @@ static void __vunmap(const void *addr, int deallocate_pages)
|
||||
addr))
|
||||
return;
|
||||
|
||||
area = remove_vm_area(addr);
|
||||
area = find_vmap_area((unsigned long)addr)->vm;
|
||||
if (unlikely(!area)) {
|
||||
WARN(1, KERN_ERR "Trying to vfree() nonexistent vm area (%p)\n",
|
||||
addr);
|
||||
@@ -1514,6 +1514,7 @@ static void __vunmap(const void *addr, int deallocate_pages)
|
||||
debug_check_no_locks_freed(addr, get_vm_area_size(area));
|
||||
debug_check_no_obj_freed(addr, get_vm_area_size(area));
|
||||
|
||||
remove_vm_area(addr);
|
||||
if (deallocate_pages) {
|
||||
int i;
|
||||
|
||||
|
||||
Reference in new issue
Block a user