Commit 75927af8 authored by Nick Piggin's avatar Nick Piggin Committed by Linus Torvalds

mm: madvise(): correct return code

The posix_madvise() function succeeds (and does nothing) when called with
parameters (NULL, 0, -1); according to LSB tests, it should fail with
EINVAL because -1 is not a valid flag.

When called with a valid address and size, it correctly fails.

So perform an initial check for valid flags first.
Reported-by: default avatarJiri Dluhos <jdluhos@novell.com>
Signed-off-by: default avatarNick Piggin <npiggin@suse.de>
Reviewed-and-Tested-by: default avatarWANG Cong <xiyou.wangcong@gmail.com>
Cc: Michael Kerrisk <mtk.manpages@googlemail.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent dab48dab
...@@ -238,12 +238,30 @@ madvise_vma(struct vm_area_struct *vma, struct vm_area_struct **prev, ...@@ -238,12 +238,30 @@ madvise_vma(struct vm_area_struct *vma, struct vm_area_struct **prev,
break; break;
default: default:
error = -EINVAL; BUG();
break; break;
} }
return error; return error;
} }
static int
madvise_behavior_valid(int behavior)
{
switch (behavior) {
case MADV_DOFORK:
case MADV_DONTFORK:
case MADV_NORMAL:
case MADV_SEQUENTIAL:
case MADV_RANDOM:
case MADV_REMOVE:
case MADV_WILLNEED:
case MADV_DONTNEED:
return 1;
default:
return 0;
}
}
/* /*
* The madvise(2) system call. * The madvise(2) system call.
* *
...@@ -289,6 +307,9 @@ SYSCALL_DEFINE3(madvise, unsigned long, start, size_t, len_in, int, behavior) ...@@ -289,6 +307,9 @@ SYSCALL_DEFINE3(madvise, unsigned long, start, size_t, len_in, int, behavior)
int write; int write;
size_t len; size_t len;
if (!madvise_behavior_valid(behavior))
return error;
write = madvise_need_mmap_write(behavior); write = madvise_need_mmap_write(behavior);
if (write) if (write)
down_write(&current->mm->mmap_sem); down_write(&current->mm->mmap_sem);
......
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