mm: mark mas allocation in vms_abort_munmap_vmas as __GFP_NOFAIL
authorJann Horn <jannh@google.com>
Wed, 16 Oct 2024 15:07:53 +0000 (17:07 +0200)
committerAndrew Morton <akpm@linux-foundation.org>
Tue, 29 Oct 2024 04:40:39 +0000 (21:40 -0700)
commit14611508cb5bf031f85bae58704c9218681d8e07
tree7f8248b3c00795e663227a0b0e453ca1251bb1ca
parent1db272864ff250b5e607283eaec819e1186c8e26
mm: mark mas allocation in vms_abort_munmap_vmas as __GFP_NOFAIL

vms_abort_munmap_vmas() is a recovery path where, on entry, some VMAs have
already been torn down halfway (in a way we can't undo) but are still
present in the maple tree.

At this point, we *must* remove the VMAs from the VMA tree, otherwise we
get UAF.

Because removing VMA tree nodes can require memory allocation, the
existing code has an error path which tries to handle this by reattaching
the VMAs; but that can't be done safely.

A nicer way to fix it would probably be to preallocate enough maple tree
nodes for the removal before the point of no return, or something like
that; but for now, fix it the easy and kinda ugly way, by marking this
allocation __GFP_NOFAIL.

Link: https://lkml.kernel.org/r/20241016-fix-munmap-abort-v1-1-601c94b2240d@google.com
Fixes: 4f87153e82c4 ("mm: change failure of MAP_FIXED to restoring the gap on failure")
Signed-off-by: Jann Horn <jannh@google.com>
Reviewed-by: Liam R. Howlett <Liam.Howlett@Oracle.com>
Acked-by: Vlastimil Babka <vbabka@suse.cz>
Reviewed-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/vma.h