mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 11:11:45 -04:00
take security_mmap_file() outside of ->mmap_sem
Signed-off-by: Al Viro <[email protected]>
This commit is contained in:
parent
e5467859f7
commit
8b3ec6814c
5 changed files with 62 additions and 28 deletions
23
mm/mmap.c
23
mm/mmap.c
|
|
@ -979,7 +979,6 @@ static unsigned long do_mmap_pgoff(struct file *file, unsigned long addr,
|
|||
struct inode *inode;
|
||||
vm_flags_t vm_flags;
|
||||
int error;
|
||||
unsigned long reqprot = prot;
|
||||
|
||||
/*
|
||||
* Does the application expect PROT_READ to imply PROT_EXEC?
|
||||
|
|
@ -1105,10 +1104,6 @@ static unsigned long do_mmap_pgoff(struct file *file, unsigned long addr,
|
|||
if (error)
|
||||
return error;
|
||||
|
||||
error = security_mmap_file(file, reqprot, prot, flags);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
return mmap_region(file, addr, len, flags, vm_flags, pgoff);
|
||||
}
|
||||
|
||||
|
|
@ -1130,9 +1125,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);
|
||||
|
|
@ -1168,9 +1166,12 @@ SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len,
|
|||
|
||||
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
retval = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
retval = security_mmap_file(file, prot, flags);
|
||||
if (!retval) {
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
retval = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
}
|
||||
|
||||
if (file)
|
||||
fput(file);
|
||||
|
|
|
|||
22
mm/nommu.c
22
mm/nommu.c
|
|
@ -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(¤t->mm->mmap_sem);
|
||||
retval = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
ret = security_mmap_file(file, prot, flags);
|
||||
if (!ret) {
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
retval = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
}
|
||||
|
||||
if (file)
|
||||
fput(file);
|
||||
|
|
|
|||
Loading…
Reference in a new issue