Message ID | 20221024193336.1233616-2-peterx@redhat.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | mm/uffd: Fix vma check | expand |
On Mon, Oct 24, 2022 at 03:33:35PM -0400, Peter Xu wrote: > We used to have a report that pte-marker code can be reached even when > uffd-wp is not compiled in for file memories, here: > > https://lore.kernel.org/all/YzeR+R6b4bwBlBHh@x1n/T/#u > > I just got time to revisit this and found that the root cause is we simply > messed up with the vma check, so that for !PTE_MARKER_UFFD_WP system, we > will allow UFFDIO_REGISTER of MINOR & WP upon shmem as the check was wrong: > > if (vm_flags & VM_UFFD_MINOR) > return is_vm_hugetlb_page(vma) || vma_is_shmem(vma); > > Where we'll allow anything to pass on shmem as long as minor mode is > requested. > > Axel did it right when introducing minor mode but I messed it up in > b1f9e876862d when moving code around. Fix it. > > Cc: Axel Rasmussen <axelrasmussen@google.com> > Fixes: b1f9e876862d ("mm/uffd: enable write protection for shmem & hugetlbfs") Should also have had: Cc: stable@vger.kernel.org > Signed-off-by: Peter Xu <peterx@redhat.com>
diff --git a/include/linux/userfaultfd_k.h b/include/linux/userfaultfd_k.h index f07e6998bb68..9df0b9a762cc 100644 --- a/include/linux/userfaultfd_k.h +++ b/include/linux/userfaultfd_k.h @@ -146,9 +146,9 @@ static inline bool userfaultfd_armed(struct vm_area_struct *vma) static inline bool vma_can_userfault(struct vm_area_struct *vma, unsigned long vm_flags) { - if (vm_flags & VM_UFFD_MINOR) - return is_vm_hugetlb_page(vma) || vma_is_shmem(vma); - + if ((vm_flags & VM_UFFD_MINOR) && + (!is_vm_hugetlb_page(vma) && !vma_is_shmem(vma))) + return false; #ifndef CONFIG_PTE_MARKER_UFFD_WP /* * If user requested uffd-wp but not enabled pte markers for
We used to have a report that pte-marker code can be reached even when uffd-wp is not compiled in for file memories, here: https://lore.kernel.org/all/YzeR+R6b4bwBlBHh@x1n/T/#u I just got time to revisit this and found that the root cause is we simply messed up with the vma check, so that for !PTE_MARKER_UFFD_WP system, we will allow UFFDIO_REGISTER of MINOR & WP upon shmem as the check was wrong: if (vm_flags & VM_UFFD_MINOR) return is_vm_hugetlb_page(vma) || vma_is_shmem(vma); Where we'll allow anything to pass on shmem as long as minor mode is requested. Axel did it right when introducing minor mode but I messed it up in b1f9e876862d when moving code around. Fix it. Cc: Axel Rasmussen <axelrasmussen@google.com> Fixes: b1f9e876862d ("mm/uffd: enable write protection for shmem & hugetlbfs") Signed-off-by: Peter Xu <peterx@redhat.com> --- include/linux/userfaultfd_k.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)