lkml.org 
[lkml]   [2019]   [Mar]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.14 062/123] vfs: fix preadv64v2 and pwritev64v2 compat syscalls with offset == -1
    Date
    From: Aurelien Jarno <aurelien@aurel32.net>

    [ Upstream commit cc4b1242d7e3b42eed73881fc749944146493e4f ]

    The preadv2 and pwritev2 syscalls are supposed to emulate the readv and
    writev syscalls when offset == -1. Therefore the compat code should
    check for offset before calling do_compat_preadv64 and
    do_compat_pwritev64. This is the case for the preadv2 and pwritev2
    syscalls, but handling of offset == -1 is missing in their 64-bit
    equivalent.

    This patch fixes that, calling do_compat_readv and do_compat_writev when
    offset == -1. This fixes the following glibc tests on x32:
    - misc/tst-preadvwritev2
    - misc/tst-preadvwritev64v2

    Cc: Alexander Viro <viro@zeniv.linux.org.uk>
    Cc: H.J. Lu <hjl.tools@gmail.com>
    Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
    Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    fs/read_write.c | 6 ++++++
    1 file changed, 6 insertions(+)

    diff --git a/fs/read_write.c b/fs/read_write.c
    index 57a00ef895b2..1c3eada2fe25 100644
    --- a/fs/read_write.c
    +++ b/fs/read_write.c
    @@ -1235,6 +1235,9 @@ COMPAT_SYSCALL_DEFINE5(preadv64v2, unsigned long, fd,
    const struct compat_iovec __user *,vec,
    unsigned long, vlen, loff_t, pos, rwf_t, flags)
    {
    + if (pos == -1)
    + return do_compat_readv(fd, vec, vlen, flags);
    +
    return do_compat_preadv64(fd, vec, vlen, pos, flags);
    }
    #endif
    @@ -1341,6 +1344,9 @@ COMPAT_SYSCALL_DEFINE5(pwritev64v2, unsigned long, fd,
    const struct compat_iovec __user *,vec,
    unsigned long, vlen, loff_t, pos, rwf_t, flags)
    {
    + if (pos == -1)
    + return do_compat_writev(fd, vec, vlen, flags);
    +
    return do_compat_pwritev64(fd, vec, vlen, pos, flags);
    }
    #endif
    --
    2.19.1
    \
     
     \ /
      Last update: 2019-03-27 19:50    [W:4.058 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site