include/linux/eventpoll.h | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/include/linux/eventpoll.h b/include/linux/eventpoll.h index ccb478eb174b..6bceed34bb21 100644 --- a/include/linux/eventpoll.h +++ b/include/linux/eventpoll.h @@ -82,11 +82,20 @@ static inline struct epoll_event __user * epoll_put_uevent(__poll_t revents, __u64 data, struct epoll_event __user *uevent) { - if (__put_user(revents, &uevent->events) || - __put_user(data, &uevent->data)) + if (can_do_masked_user_access()) + uevent = masked_user_access_begin(uevent); + else if (!user_write_access_begin(uevent, sizeof(*uevent))) return NULL; + unsafe_put_user(revents, &uevent->events, Efault); + unsafe_put_user(data, &uevent->data, Efault); + + user_write_access_end(); return uevent+1; + +Efault: + user_access_end(); + return NULL; } #endif