take security_mmap_file() outside of ->mmap_sem
[GitHub/LineageOS/android_kernel_motorola_exynos9610.git] / mm / nommu.c
index acfe419785dbca380512f7f350bb6b4e5a485e85..8cbfd623b04a2b4a3f3302034f6b1baf780bb120 100644 (file)
@@ -889,7 +889,6 @@ static int validate_mmap_request(struct file *file,
                                 unsigned long *_capabilities)
 {
        unsigned long capabilities, rlen;
-       unsigned long reqprot = prot;
        int ret;
 
        /* do the simple checks first */
@@ -1048,9 +1047,6 @@ static int validate_mmap_request(struct file *file,
 
        /* allow the security API to have its say */
        ret = security_mmap_addr(addr);
-       if (ret < 0)
-               return ret;
-       ret = security_mmap_file(file, reqprot, prot, flags);
        if (ret < 0)
                return ret;
 
@@ -1492,9 +1488,12 @@ unsigned long vm_mmap(struct file *file, unsigned long addr,
        unsigned long ret;
        struct mm_struct *mm = current->mm;
 
-       down_write(&mm->mmap_sem);
-       ret = do_mmap(file, addr, len, prot, flag, offset);
-       up_write(&mm->mmap_sem);
+       ret = security_mmap_file(file, prot, flag);
+       if (!ret) {
+               down_write(&mm->mmap_sem);
+               ret = do_mmap(file, addr, len, prot, flag, offset);
+               up_write(&mm->mmap_sem);
+       }
        return ret;
 }
 EXPORT_SYMBOL(vm_mmap);
@@ -1515,9 +1514,12 @@ SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len,
 
        flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
 
-       down_write(&current->mm->mmap_sem);
-       retval = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
-       up_write(&current->mm->mmap_sem);
+       ret = security_mmap_file(file, prot, flags);
+       if (!ret) {
+               down_write(&current->mm->mmap_sem);
+               retval = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
+               up_write(&current->mm->mmap_sem);
+       }
 
        if (file)
                fput(file);