mm-hugetlbc-fix-uaf-of-vma-in-hugetlb-fault-pathway.patch removed from -mm tree
The quilt patch titled
Subject: mm/hugetlb.c: fix UAF of vma in hugetlb fault pathway
has been removed from the -mm tree. Its filename was
mm-hugetlbc-fix-uaf-of-vma-in-hugetlb-fault-pathway.patch
This patch was dropped because it was merged into the mm-hotfixes-stable branch of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
------------------------------------------------------
From: "Vishal Moola (Oracle)" <[email protected]>
Subject: mm/hugetlb.c: fix UAF of vma in hugetlb fault pathway
Date: Sat, 14 Sep 2024 12:41:19 -0700
Syzbot reports a UAF in hugetlb_fault(). This happens because vmf_anon_prepare() could drop the per-VMA lock and allow the current VMA to be freed before hugetlb_vma_unlock_read() is called.
We can fix this by using a modified version of vmf_anon_prepare() that doesn't release the VMA lock on failure, and then release it ourselves after hugetlb_vma_unlock_read().
---
mm/hugetlb.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-)
mm/hugetlb.c renamed from mm/hugetlb.c~mm-hugetlbc-fix-uaf-of-vma-in-hugetlb-fault-pathway +18 -2
@@ -6048,7 +6048,7 @@ retry_avoidcopy:* When the original hugepage is shared one, it does not have * anon_vma prepared. */ - ret =vmf_anon_prepare (vmf); + ret =__vmf_anon_prepare (vmf);if (unlikely (ret)) goto out_release_all;
@@ -6247,7 +6247,7 @@ static vm_fault_t hugetlb_no_page(struct }if (!(vma->vm_flags &VM_MAYSHARE )) { - ret =vmf_anon_prepare (vmf); + ret =__vmf_anon_prepare (vmf);if (unlikely (ret)) goto out; }
@@ -6378,6 +6378,14 @@ static vm_fault_t hugetlb_no_page(structfolio_unlock (folio); out:hugetlb_vma_unlock_read (vma); + +/* +* We must check to release the per-VMA lock. __vmf_anon_prepare() is +* the only way ret can be set to VM_FAULT_RETRY. +*/ +if (unlikely (ret &VM_FAULT_RETRY )) +vma_end_read (vma); +mutex_unlock (&hugetlb_fault_mutex_table[hash]);return ret;
@@ -6599,6 +6607,14 @@ out_ptl: } out_mutex:hugetlb_vma_unlock_read (vma); + +/* +* We must check to release the per-VMA lock. __vmf_anon_prepare() in +* hugetlb_wp() is the only way ret can be set to VM_FAULT_RETRY. +*/ +if (unlikely (ret &VM_FAULT_RETRY )) +vma_end_read (vma); +mutex_unlock (&hugetlb_fault_mutex_table[hash]);/* * Generally it's safe to hold refcount during waiting page lock. But
_
Patches currently in -mm which might be from [email protected] are