Messages in this thread Patch in this message | | | From | Matt Helsley <> | Subject | [RFC][PATCH 1/4] anon_inode fcntl() checks: report failure for fcntl(F_SETFL) on signalfd | Date | Sat, 13 Feb 2010 16:27:44 -0800 |
| |
anon_inode interfaces often do not support flags that can be set by fcntl(). Right now using fcntl() to set these flags falsely reports success for things like O_ASYNC (yet SIGIO is not delivered).
Report failure when userspace attempts to set unsupported flags on signalfd files with fcntl().
Signed-off-by: Matt Helsley <matthltc@us.ibm.com> Cc: Davide Libenzi <davidel@xmailserver.org> --- fs/signalfd.c | 19 +++++++++++++------ 1 files changed, 13 insertions(+), 6 deletions(-)
diff --git a/fs/signalfd.c b/fs/signalfd.c index 1dabe4e..3016f3b 100644 --- a/fs/signalfd.c +++ b/fs/signalfd.c @@ -199,7 +199,19 @@ static ssize_t signalfd_read(struct file *file, char __user *buf, size_t count, return total ? total: ret; } +static int signalfd_check_flags(int flags) +{ + /* Check the SFD_* constants for consistency. */ + BUILD_BUG_ON(SFD_CLOEXEC != O_CLOEXEC); + BUILD_BUG_ON(SFD_NONBLOCK != O_NONBLOCK); + + if (flags & ~(SFD_CLOEXEC | SFD_NONBLOCK)) + return -EINVAL; + return 0; +} + static const struct file_operations signalfd_fops = { + .check_flags = signalfd_check_flags, .release = signalfd_release, .poll = signalfd_poll, .read = signalfd_read, @@ -211,13 +223,8 @@ SYSCALL_DEFINE4(signalfd4, int, ufd, sigset_t __user *, user_mask, sigset_t sigmask; struct signalfd_ctx *ctx; - /* Check the SFD_* constants for consistency. */ - BUILD_BUG_ON(SFD_CLOEXEC != O_CLOEXEC); - BUILD_BUG_ON(SFD_NONBLOCK != O_NONBLOCK); - - if (flags & ~(SFD_CLOEXEC | SFD_NONBLOCK)) + if (signalfd_check_flags(flags)) return -EINVAL; - if (sizemask != sizeof(sigset_t) || copy_from_user(&sigmask, user_mask, sizeof(sigmask))) return -EINVAL; -- 1.6.3.3
| |