You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
fs/compat: fix parameter handling for compat readv/writev syscalls
We got a report that the pwritev syscall does not work correctly in
compat mode on s390.
It turned out that with commit 72ec35163f ("switch compat readv/writev
variants to COMPAT_SYSCALL_DEFINE") we lost the zero extension of a
couple of syscall parameters because the some parameter types haven't
been converted from unsigned long to compat_ulong_t.
This is needed for architectures where the ABI requires that the caller
of a function performed zero and/or sign extension to 64 bit of all
parameters.
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: <stable@vger.kernel.org> [v3.10+]
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
4a404bea94
commit
dfd948e32a
+8
-8
@@ -964,9 +964,9 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
COMPAT_SYSCALL_DEFINE3(readv, unsigned long, fd,
|
||||
COMPAT_SYSCALL_DEFINE3(readv, compat_ulong_t, fd,
|
||||
const struct compat_iovec __user *,vec,
|
||||
unsigned long, vlen)
|
||||
compat_ulong_t, vlen)
|
||||
{
|
||||
struct fd f = fdget(fd);
|
||||
ssize_t ret;
|
||||
@@ -1001,9 +1001,9 @@ COMPAT_SYSCALL_DEFINE4(preadv64, unsigned long, fd,
|
||||
return ret;
|
||||
}
|
||||
|
||||
COMPAT_SYSCALL_DEFINE5(preadv, unsigned long, fd,
|
||||
COMPAT_SYSCALL_DEFINE5(preadv, compat_ulong_t, fd,
|
||||
const struct compat_iovec __user *,vec,
|
||||
unsigned long, vlen, u32, pos_low, u32, pos_high)
|
||||
compat_ulong_t, vlen, u32, pos_low, u32, pos_high)
|
||||
{
|
||||
loff_t pos = ((loff_t)pos_high << 32) | pos_low;
|
||||
return compat_sys_preadv64(fd, vec, vlen, pos);
|
||||
@@ -1031,9 +1031,9 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
COMPAT_SYSCALL_DEFINE3(writev, unsigned long, fd,
|
||||
COMPAT_SYSCALL_DEFINE3(writev, compat_ulong_t, fd,
|
||||
const struct compat_iovec __user *, vec,
|
||||
unsigned long, vlen)
|
||||
compat_ulong_t, vlen)
|
||||
{
|
||||
struct fd f = fdget(fd);
|
||||
ssize_t ret;
|
||||
@@ -1068,9 +1068,9 @@ COMPAT_SYSCALL_DEFINE4(pwritev64, unsigned long, fd,
|
||||
return ret;
|
||||
}
|
||||
|
||||
COMPAT_SYSCALL_DEFINE5(pwritev, unsigned long, fd,
|
||||
COMPAT_SYSCALL_DEFINE5(pwritev, compat_ulong_t, fd,
|
||||
const struct compat_iovec __user *,vec,
|
||||
unsigned long, vlen, u32, pos_low, u32, pos_high)
|
||||
compat_ulong_t, vlen, u32, pos_low, u32, pos_high)
|
||||
{
|
||||
loff_t pos = ((loff_t)pos_high << 32) | pos_low;
|
||||
return compat_sys_pwritev64(fd, vec, vlen, pos);
|
||||
|
||||
Reference in New Issue
Block a user