Commit 1e624196 authored by Ram Gupta's avatar Ram Gupta Committed by Linus Torvalds

[PATCH] mm: fix bug in brk()

The code checks for newbrk with oldbrk which are page aligned before making
a check for the memory limit set of data segment.  If the memory limit is
not page aligned in that case it bypasses the test for the limit if the
memory allocation is still for the same page.
Signed-off-by: default avatarRam Gupta <ram.gupta5@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent d6fef9da
...@@ -220,6 +220,17 @@ asmlinkage unsigned long sys_brk(unsigned long brk) ...@@ -220,6 +220,17 @@ asmlinkage unsigned long sys_brk(unsigned long brk)
if (brk < mm->end_code) if (brk < mm->end_code)
goto out; goto out;
/*
* Check against rlimit here. If this check is done later after the test
* of oldbrk with newbrk then it can escape the test and let the data
* segment grow beyond its set limit the in case where the limit is
* not page aligned -Ram Gupta
*/
rlim = current->signal->rlim[RLIMIT_DATA].rlim_cur;
if (rlim < RLIM_INFINITY && brk - mm->start_data > rlim)
goto out;
newbrk = PAGE_ALIGN(brk); newbrk = PAGE_ALIGN(brk);
oldbrk = PAGE_ALIGN(mm->brk); oldbrk = PAGE_ALIGN(mm->brk);
if (oldbrk == newbrk) if (oldbrk == newbrk)
...@@ -232,11 +243,6 @@ asmlinkage unsigned long sys_brk(unsigned long brk) ...@@ -232,11 +243,6 @@ asmlinkage unsigned long sys_brk(unsigned long brk)
goto out; goto out;
} }
/* Check against rlimit.. */
rlim = current->signal->rlim[RLIMIT_DATA].rlim_cur;
if (rlim < RLIM_INFINITY && brk - mm->start_data > rlim)
goto out;
/* Check against existing mmap mappings. */ /* Check against existing mmap mappings. */
if (find_vma_intersection(mm, oldbrk, newbrk+PAGE_SIZE)) if (find_vma_intersection(mm, oldbrk, newbrk+PAGE_SIZE))
goto out; goto out;
......
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