Commit 93ea1d0a authored by Chris Wright's avatar Chris Wright Committed by Linus Torvalds

[PATCH] RLIMIT_MEMLOCK checking fix

Always use page counts when doing RLIMIT_MEMLOCK checking to avoid possible
overflow.
Signed-off-by: default avatarChris Wright <chrisw@osdl.org>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent edfbe2b0
...@@ -937,9 +937,10 @@ unsigned long do_mmap_pgoff(struct file * file, unsigned long addr, ...@@ -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) ...@@ -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;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment