]>
Commit | Line | Data |
---|---|---|
00e5a55c BS |
1 | From: Nick Piggin <npiggin@suse.de> |
2 | Subject: mm: madvise correct return code | |
3 | References: bnc#352998 | |
4 | ||
5 | madvise should return -EINVAL if passed in an invalid flag, even if the | |
6 | requested range is 0. | |
7 | ||
8 | Signed-off-by: Nick Piggin <npiggin@suse.de> | |
9 | --- | |
10 | --- | |
11 | mm/madvise.c | 23 ++++++++++++++++++++++- | |
12 | 1 file changed, 22 insertions(+), 1 deletion(-) | |
13 | ||
14 | --- a/mm/madvise.c | |
15 | +++ b/mm/madvise.c | |
16 | @@ -247,12 +247,30 @@ madvise_vma(struct vm_area_struct *vma, | |
17 | break; | |
18 | ||
19 | default: | |
20 | - error = -EINVAL; | |
21 | + BUG(); | |
22 | break; | |
23 | } | |
24 | return error; | |
25 | } | |
26 | ||
27 | +static int | |
28 | +madvise_behavior_valid(int behavior) | |
29 | +{ | |
30 | + switch (behavior) { | |
31 | + case MADV_DOFORK: | |
32 | + case MADV_DONTFORK: | |
33 | + case MADV_NORMAL: | |
34 | + case MADV_SEQUENTIAL: | |
35 | + case MADV_RANDOM: | |
36 | + case MADV_REMOVE: | |
37 | + case MADV_WILLNEED: | |
38 | + case MADV_DONTNEED: | |
39 | + return 1; | |
40 | + | |
41 | + default: | |
42 | + return 0; | |
43 | + } | |
44 | +} | |
45 | /* | |
46 | * The madvise(2) system call. | |
47 | * | |
48 | @@ -298,6 +316,9 @@ SYSCALL_DEFINE3(madvise, unsigned long, | |
49 | int write; | |
50 | size_t len; | |
51 | ||
52 | + if (!madvise_behavior_valid(behavior)) | |
53 | + return error; | |
54 | + | |
55 | write = madvise_need_mmap_write(behavior); | |
56 | if (write) | |
57 | down_write(¤t->mm->mmap_sem); |