ARM: 8792/1: oabi-compat: copy oabi events using __copy_to_user()
authorJulien Thierry <julien.thierry@arm.com>
Thu, 14 Feb 2019 14:49:17 +0000 (09:49 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 20 Feb 2019 09:18:25 +0000 (10:18 +0100)
Commit 319508902600c2688e057750148487996396e9ca upstream.

Copy events to user using __copy_to_user() rather than copy members of
individually with __put_user_error().
This has the benefit of disabling/enabling PAN once per event intead of
once per event member.

Signed-off-by: Julien Thierry <julien.thierry@arm.com>
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
Signed-off-by: David A. Long <dave.long@linaro.org>
Reviewed-by: Julien Thierry <julien.thierry@arm.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
arch/arm/kernel/sys_oabi-compat.c

index 640748e270352caf903ae171b6aed8386c1c21eb..d844c5c9364bbf056099d69bad5ea55fcb101704 100644 (file)
@@ -276,6 +276,7 @@ asmlinkage long sys_oabi_epoll_wait(int epfd,
                                    int maxevents, int timeout)
 {
        struct epoll_event *kbuf;
+       struct oabi_epoll_event e;
        mm_segment_t fs;
        long ret, err, i;
 
@@ -294,8 +295,11 @@ asmlinkage long sys_oabi_epoll_wait(int epfd,
        set_fs(fs);
        err = 0;
        for (i = 0; i < ret; i++) {
-               __put_user_error(kbuf[i].events, &events->events, err);
-               __put_user_error(kbuf[i].data,   &events->data,   err);
+               e.events = kbuf[i].events;
+               e.data = kbuf[i].data;
+               err = __copy_to_user(events, &e, sizeof(e));
+               if (err)
+                       break;
                events++;
        }
        kfree(kbuf);