Fix http://bugme.osdl.org/show_bug.cgi?id=2710. When the user passed madvise a length of -1 through -4095, madvise blindly rounds this up to 0 then "succeeds". --- 25-akpm/mm/madvise.c | 10 ++++++++-- 1 files changed, 8 insertions(+), 2 deletions(-) diff -puN mm/madvise.c~madvise-len-check mm/madvise.c --- 25/mm/madvise.c~madvise-len-check 2004-05-18 18:32:00.201704672 -0700 +++ 25-akpm/mm/madvise.c 2004-05-18 18:32:00.205704064 -0700 @@ -169,18 +169,24 @@ static long madvise_vma(struct vm_area_s * -EBADF - map exists, but area maps something that isn't a file. * -EAGAIN - a kernel resource was temporarily unavailable. */ -asmlinkage long sys_madvise(unsigned long start, size_t len, int behavior) +asmlinkage long sys_madvise(unsigned long start, size_t len_in, int behavior) { unsigned long end; struct vm_area_struct * vma; int unmapped_error = 0; int error = -EINVAL; + size_t len; down_write(¤t->mm->mmap_sem); if (start & ~PAGE_MASK) goto out; - len = (len + ~PAGE_MASK) & PAGE_MASK; + len = (len_in + ~PAGE_MASK) & PAGE_MASK; + + /* Check to see whether len was rounded up from small -ve to zero */ + if (len_in && !len) + goto out; + end = start + len; if (end < start) goto out; _