mirror of
https://github.com/rd-stuffs/msm-4.14.git
synced 2025-02-20 11:45:48 +08:00
ftruncate: pass a signed offset
commit 4b8e88e563b5f666446d002ad0dc1e6e8e7102b0 upstream. The old ftruncate() syscall, using the 32-bit off_t misses a sign extension when called in compat mode on 64-bit architectures. As a result, passing a negative length accidentally succeeds in truncating to file size between 2GiB and 4GiB. Changing the type of the compat syscall to the signed compat_off_t changes the behavior so it instead returns -EINVAL. The native entry point, the truncate() syscall and the corresponding loff_t based variants are all correct already and do not suffer from this mistake. Fixes: 3f6d078d4acc ("fix compat truncate/ftruncate") Reviewed-by: Christian Brauner <brauner@kernel.org> Cc: stable@vger.kernel.org Signed-off-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> (cherry picked from commit c329760749b5419769e57cb2be80955d2805f9c9) [Vegard: fixed conflicts in context] Signed-off-by: Vegard Nossum <vegard.nossum@oracle.com>
This commit is contained in:
parent
e6522330b7
commit
5696aad6bf
@ -210,13 +210,13 @@ out:
|
||||
return error;
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE2(ftruncate, unsigned int, fd, unsigned long, length)
|
||||
SYSCALL_DEFINE2(ftruncate, unsigned int, fd, off_t, length)
|
||||
{
|
||||
return do_sys_ftruncate(fd, length, 1);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
COMPAT_SYSCALL_DEFINE2(ftruncate, unsigned int, fd, compat_ulong_t, length)
|
||||
COMPAT_SYSCALL_DEFINE2(ftruncate, unsigned int, fd, compat_off_t, length)
|
||||
{
|
||||
return do_sys_ftruncate(fd, length, 1);
|
||||
}
|
||||
|
@ -563,7 +563,7 @@ asmlinkage long compat_sys_open_by_handle_at(int mountdirfd,
|
||||
struct file_handle __user *handle,
|
||||
int flags);
|
||||
asmlinkage long compat_sys_truncate(const char __user *, compat_off_t);
|
||||
asmlinkage long compat_sys_ftruncate(unsigned int, compat_ulong_t);
|
||||
asmlinkage long compat_sys_ftruncate(unsigned int, compat_off_t);
|
||||
asmlinkage long compat_sys_pselect6(int n, compat_ulong_t __user *inp,
|
||||
compat_ulong_t __user *outp,
|
||||
compat_ulong_t __user *exp,
|
||||
|
@ -426,7 +426,7 @@ asmlinkage long sys_mount(char __user *dev_name, char __user *dir_name,
|
||||
asmlinkage long sys_umount(char __user *name, int flags);
|
||||
asmlinkage long sys_oldumount(char __user *name);
|
||||
asmlinkage long sys_truncate(const char __user *path, long length);
|
||||
asmlinkage long sys_ftruncate(unsigned int fd, unsigned long length);
|
||||
asmlinkage long sys_ftruncate(unsigned int fd, off_t length);
|
||||
asmlinkage long sys_stat(const char __user *filename,
|
||||
struct __old_kernel_stat __user *statbuf);
|
||||
asmlinkage long sys_statfs(const char __user * path,
|
||||
|
Loading…
x
Reference in New Issue
Block a user