| From: Luca Vizzarro <Luca.Vizzarro@arm.com> |
| Subject: memfd: pass argument of memfd_fcntl as int |
| Date: Fri, 14 Apr 2023 16:24:58 +0100 |
| |
| The interface for fcntl expects the argument passed for the command |
| F_ADD_SEALS to be of type int. The current code wrongly treats it as a |
| long. In order to avoid access to undefined bits, we should explicitly |
| cast the argument to int. |
| |
| This commit changes the signature of all the related and helper functions |
| so that they treat the argument as int instead of long. |
| |
| Link: https://lkml.kernel.org/r/20230414152459.816046-5-Luca.Vizzarro@arm.com |
| Signed-off-by: Luca Vizzarro <Luca.Vizzarro@arm.com> |
| Cc: Alexander Viro <viro@zeniv.linux.org.uk> |
| Cc: Christian Brauner <brauner@kernel.org> |
| Cc: Jeff Layton <jlayton@kernel.org> |
| Cc: Chuck Lever <chuck.lever@oracle.com> |
| Cc: Kevin Brodsky <Kevin.Brodsky@arm.com> |
| Cc: Vincenzo Frascino <Vincenzo.Frascino@arm.com> |
| Cc: Szabolcs Nagy <Szabolcs.Nagy@arm.com> |
| Cc: "Theodore Ts'o" <tytso@mit.edu> |
| Cc: David Laight <David.Laight@ACULAB.com> |
| Cc: Mark Rutland <Mark.Rutland@arm.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| include/linux/memfd.h | 4 ++-- |
| mm/memfd.c | 6 +----- |
| 2 files changed, 3 insertions(+), 7 deletions(-) |
| |
| --- a/include/linux/memfd.h~memfd-pass-argument-of-memfd_fcntl-as-int |
| +++ a/include/linux/memfd.h |
| @@ -5,9 +5,9 @@ |
| #include <linux/file.h> |
| |
| #ifdef CONFIG_MEMFD_CREATE |
| -extern long memfd_fcntl(struct file *file, unsigned int cmd, unsigned long arg); |
| +extern long memfd_fcntl(struct file *file, unsigned int cmd, unsigned int arg); |
| #else |
| -static inline long memfd_fcntl(struct file *f, unsigned int c, unsigned long a) |
| +static inline long memfd_fcntl(struct file *f, unsigned int c, unsigned int a) |
| { |
| return -EINVAL; |
| } |
| --- a/mm/memfd.c~memfd-pass-argument-of-memfd_fcntl-as-int |
| +++ a/mm/memfd.c |
| @@ -243,16 +243,12 @@ static int memfd_get_seals(struct file * |
| return seals ? *seals : -EINVAL; |
| } |
| |
| -long memfd_fcntl(struct file *file, unsigned int cmd, unsigned long arg) |
| +long memfd_fcntl(struct file *file, unsigned int cmd, unsigned int arg) |
| { |
| long error; |
| |
| switch (cmd) { |
| case F_ADD_SEALS: |
| - /* disallow upper 32bit */ |
| - if (arg > UINT_MAX) |
| - return -EINVAL; |
| - |
| error = memfd_add_seals(file, arg); |
| break; |
| case F_GET_SEALS: |
| _ |