[PATCH] RLIMIT_MEMLOCK checking fix
Always use page counts when doing RLIMIT_MEMLOCK checking to avoid possible overflow. Signed-off-by: Chris Wright <chrisw@osdl.org> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
edfbe2b003
commit
93ea1d0a12
10
mm/mmap.c
10
mm/mmap.c
@ -937,9 +937,10 @@ unsigned long do_mmap_pgoff(struct file * file, unsigned long addr,
|
|||||||
/* mlock MCL_FUTURE? */
|
/* mlock MCL_FUTURE? */
|
||||||
if (vm_flags & VM_LOCKED) {
|
if (vm_flags & VM_LOCKED) {
|
||||||
unsigned long locked, lock_limit;
|
unsigned long locked, lock_limit;
|
||||||
locked = mm->locked_vm << PAGE_SHIFT;
|
locked = len >> PAGE_SHIFT;
|
||||||
|
locked += mm->locked_vm;
|
||||||
lock_limit = current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur;
|
lock_limit = current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur;
|
||||||
locked += len;
|
lock_limit >>= PAGE_SHIFT;
|
||||||
if (locked > lock_limit && !capable(CAP_IPC_LOCK))
|
if (locked > lock_limit && !capable(CAP_IPC_LOCK))
|
||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
}
|
}
|
||||||
@ -1822,9 +1823,10 @@ unsigned long do_brk(unsigned long addr, unsigned long len)
|
|||||||
*/
|
*/
|
||||||
if (mm->def_flags & VM_LOCKED) {
|
if (mm->def_flags & VM_LOCKED) {
|
||||||
unsigned long locked, lock_limit;
|
unsigned long locked, lock_limit;
|
||||||
locked = mm->locked_vm << PAGE_SHIFT;
|
locked = len >> PAGE_SHIFT;
|
||||||
|
locked += mm->locked_vm;
|
||||||
lock_limit = current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur;
|
lock_limit = current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur;
|
||||||
locked += len;
|
lock_limit >>= PAGE_SHIFT;
|
||||||
if (locked > lock_limit && !capable(CAP_IPC_LOCK))
|
if (locked > lock_limit && !capable(CAP_IPC_LOCK))
|
||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user