swapon: check validity of swap_flags
authorHugh Dickins <hughd@google.com>
Wed, 28 Mar 2012 21:42:42 +0000 (14:42 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 29 Mar 2012 00:14:35 +0000 (17:14 -0700)
Most system calls taking flags first check that the flags passed in are
valid, and that helps userspace to detect when new flags are supported.

But swapon never did so: start checking now, to help if we ever want to
support more swap_flags in future.

It's difficult to get stray bits set in an int, and swapon is not widely
used, so this is most unlikely to break any userspace; but we can just
revert if it turns out to do so.

Signed-off-by: Hugh Dickins <hughd@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
include/linux/swap.h
mm/swapfile.c

index b86b5c20617d93e361d462e20c0c3c87856214b6..8dc0ea7caf02baa404e8896d13351577a177547a 100644 (file)
@@ -21,6 +21,9 @@ struct bio;
 #define SWAP_FLAG_PRIO_SHIFT   0
 #define SWAP_FLAG_DISCARD      0x10000 /* discard swap cluster after use */
 
+#define SWAP_FLAGS_VALID       (SWAP_FLAG_PRIO_MASK | SWAP_FLAG_PREFER | \
+                                SWAP_FLAG_DISCARD)
+
 static inline int current_is_kswapd(void)
 {
        return current->flags & PF_KSWAPD;
index dae42f380d6ebcde88d3aaef6aa3cb1d64e0f5a3..fafc26d1b1dc885d2541eda3bdc5705a4fe56012 100644 (file)
@@ -2022,6 +2022,9 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags)
        struct page *page = NULL;
        struct inode *inode = NULL;
 
+       if (swap_flags & ~SWAP_FLAGS_VALID)
+               return -EINVAL;
+
        if (!capable(CAP_SYS_ADMIN))
                return -EPERM;