lkml.org 
[lkml]   [2019]   [Mar]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 1/2] io_uring: fix big-endian compat signal mask handling
    Date
    On big-endian architectures, the signal masks are differnet
    between 32-bit and 64-bit tasks, so we have to use a different
    function for reading them from user space.

    io_cqring_wait() initially got this wrong, and always interprets
    this as a native structure. This is ok on x86 and most arm64,
    but not on s390, ppc64be, mips64be, sparc64 and parisc.

    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    ---
    fs/io_uring.c | 10 +++++++++-
    1 file changed, 9 insertions(+), 1 deletion(-)

    diff --git a/fs/io_uring.c b/fs/io_uring.c
    index 6aaa30580a2b..8f48d29abf76 100644
    --- a/fs/io_uring.c
    +++ b/fs/io_uring.c
    @@ -1968,7 +1968,15 @@ static int io_cqring_wait(struct io_ring_ctx *ctx, int min_events,
    return 0;

    if (sig) {
    - ret = set_user_sigmask(sig, &ksigmask, &sigsaved, sigsz);
    +#ifdef CONFIG_COMPAT
    + if (in_compat_syscall())
    + ret = set_compat_user_sigmask((const compat_sigset_t __user *)sig,
    + &ksigmask, &sigsaved, sigsz);
    + else
    +#endif
    + ret = set_user_sigmask(sig, &ksigmask,
    + &sigsaved, sigsz);
    +
    if (ret)
    return ret;
    }
    --
    2.20.0
    \
     
     \ /
      Last update: 2019-03-25 15:38    [W:4.744 / U:0.048 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site