Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+22 −1
Original line number Diff line number Diff line
@@ -238,12 +238,30 @@ madvise_vma(struct vm_area_struct *vma, struct vm_area_struct **prev,
		break;

	default:
		error = -EINVAL;
		BUG();
		break;
	}
	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.
 *
@@ -289,6 +307,9 @@ SYSCALL_DEFINE3(madvise, unsigned long, start, size_t, len_in, int, behavior)
	int write;
	size_t len;

	if (!madvise_behavior_valid(behavior))
		return error;

	write = madvise_need_mmap_write(behavior);
	if (write)
		down_write(&current->mm->mmap_sem);