Patch "sparc64: Use arch_validate_flags() to validate ADI flag" has been added to the 4.19-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    sparc64: Use arch_validate_flags() to validate ADI flag

to the 4.19-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     sparc64-use-arch_validate_flags-to-validate-adi-flag.patch
and it can be found in the queue-4.19 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 1de63d8a8f79e9b6f77113011b42ab75374b9420
Author: Khalid Aziz <khalid.aziz@xxxxxxxxxx>
Date:   Fri Oct 23 11:56:11 2020 -0600

    sparc64: Use arch_validate_flags() to validate ADI flag
    
    [ Upstream commit 147d8622f2a26ef34beacc60e1ed8b66c2fa457f ]
    
    When userspace calls mprotect() to enable ADI on an address range,
    do_mprotect_pkey() calls arch_validate_prot() to validate new
    protection flags. arch_validate_prot() for sparc looks at the first
    VMA associated with address range to verify if ADI can indeed be
    enabled on this address range. This has two issues - (1) Address
    range might cover multiple VMAs while arch_validate_prot() looks at
    only the first VMA, (2) arch_validate_prot() peeks at VMA without
    holding mmap lock which can result in race condition.
    
    arch_validate_flags() from commit c462ac288f2c ("mm: Introduce
    arch_validate_flags()") allows for VMA flags to be validated for all
    VMAs that cover the address range given by user while holding mmap
    lock. This patch updates sparc code to move the VMA check from
    arch_validate_prot() to arch_validate_flags() to fix above two
    issues.
    
    Suggested-by: Jann Horn <jannh@xxxxxxxxxx>
    Suggested-by: Christoph Hellwig <hch@xxxxxxxxxxxxx>
    Suggested-by: Catalin Marinas <catalin.marinas@xxxxxxx>
    Signed-off-by: Khalid Aziz <khalid.aziz@xxxxxxxxxx>
    Reviewed-by: Catalin Marinas <catalin.marinas@xxxxxxx>
    Signed-off-by: David S. Miller <davem@xxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/arch/sparc/include/asm/mman.h b/arch/sparc/include/asm/mman.h
index f94532f25db1..274217e7ed70 100644
--- a/arch/sparc/include/asm/mman.h
+++ b/arch/sparc/include/asm/mman.h
@@ -57,35 +57,39 @@ static inline int sparc_validate_prot(unsigned long prot, unsigned long addr)
 {
 	if (prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC | PROT_SEM | PROT_ADI))
 		return 0;
-	if (prot & PROT_ADI) {
-		if (!adi_capable())
-			return 0;
+	return 1;
+}
 
-		if (addr) {
-			struct vm_area_struct *vma;
+#define arch_validate_flags(vm_flags) arch_validate_flags(vm_flags)
+/* arch_validate_flags() - Ensure combination of flags is valid for a
+ *	VMA.
+ */
+static inline bool arch_validate_flags(unsigned long vm_flags)
+{
+	/* If ADI is being enabled on this VMA, check for ADI
+	 * capability on the platform and ensure VMA is suitable
+	 * for ADI
+	 */
+	if (vm_flags & VM_SPARC_ADI) {
+		if (!adi_capable())
+			return false;
 
-			vma = find_vma(current->mm, addr);
-			if (vma) {
-				/* ADI can not be enabled on PFN
-				 * mapped pages
-				 */
-				if (vma->vm_flags & (VM_PFNMAP | VM_MIXEDMAP))
-					return 0;
+		/* ADI can not be enabled on PFN mapped pages */
+		if (vm_flags & (VM_PFNMAP | VM_MIXEDMAP))
+			return false;
 
-				/* Mergeable pages can become unmergeable
-				 * if ADI is enabled on them even if they
-				 * have identical data on them. This can be
-				 * because ADI enabled pages with identical
-				 * data may still not have identical ADI
-				 * tags on them. Disallow ADI on mergeable
-				 * pages.
-				 */
-				if (vma->vm_flags & VM_MERGEABLE)
-					return 0;
-			}
-		}
+		/* Mergeable pages can become unmergeable
+		 * if ADI is enabled on them even if they
+		 * have identical data on them. This can be
+		 * because ADI enabled pages with identical
+		 * data may still not have identical ADI
+		 * tags on them. Disallow ADI on mergeable
+		 * pages.
+		 */
+		if (vm_flags & VM_MERGEABLE)
+			return false;
 	}
-	return 1;
+	return true;
 }
 #endif /* CONFIG_SPARC64 */
 



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux