diff options
-rw-r--r-- | fs/compat.c | 4 | ||||
-rw-r--r-- | fs/read_write.c | 14 | ||||
-rw-r--r-- | include/linux/compat.h | 4 | ||||
-rw-r--r-- | include/linux/syscalls.h | 4 |
4 files changed, 16 insertions, 10 deletions
diff --git a/fs/compat.c b/fs/compat.c index 1c859dae758f..3f84d5f15889 100644 --- a/fs/compat.c +++ b/fs/compat.c | |||
@@ -1236,7 +1236,7 @@ compat_sys_readv(unsigned long fd, const struct compat_iovec __user *vec, | |||
1236 | 1236 | ||
1237 | asmlinkage ssize_t | 1237 | asmlinkage ssize_t |
1238 | compat_sys_preadv(unsigned long fd, const struct compat_iovec __user *vec, | 1238 | compat_sys_preadv(unsigned long fd, const struct compat_iovec __user *vec, |
1239 | unsigned long vlen, u32 pos_high, u32 pos_low) | 1239 | unsigned long vlen, u32 pos_low, u32 pos_high) |
1240 | { | 1240 | { |
1241 | loff_t pos = ((loff_t)pos_high << 32) | pos_low; | 1241 | loff_t pos = ((loff_t)pos_high << 32) | pos_low; |
1242 | struct file *file; | 1242 | struct file *file; |
@@ -1293,7 +1293,7 @@ compat_sys_writev(unsigned long fd, const struct compat_iovec __user *vec, | |||
1293 | 1293 | ||
1294 | asmlinkage ssize_t | 1294 | asmlinkage ssize_t |
1295 | compat_sys_pwritev(unsigned long fd, const struct compat_iovec __user *vec, | 1295 | compat_sys_pwritev(unsigned long fd, const struct compat_iovec __user *vec, |
1296 | unsigned long vlen, u32 pos_high, u32 pos_low) | 1296 | unsigned long vlen, u32 pos_low, u32 pos_high) |
1297 | { | 1297 | { |
1298 | loff_t pos = ((loff_t)pos_high << 32) | pos_low; | 1298 | loff_t pos = ((loff_t)pos_high << 32) | pos_low; |
1299 | struct file *file; | 1299 | struct file *file; |
diff --git a/fs/read_write.c b/fs/read_write.c index 6d5d8ff238aa..9d1e76bb9ee1 100644 --- a/fs/read_write.c +++ b/fs/read_write.c | |||
@@ -731,10 +731,16 @@ SYSCALL_DEFINE3(writev, unsigned long, fd, const struct iovec __user *, vec, | |||
731 | return ret; | 731 | return ret; |
732 | } | 732 | } |
733 | 733 | ||
734 | static inline loff_t pos_from_hilo(unsigned long high, unsigned long low) | ||
735 | { | ||
736 | #define HALF_LONG_BITS (BITS_PER_LONG / 2) | ||
737 | return (((loff_t)high << HALF_LONG_BITS) << HALF_LONG_BITS) | low; | ||
738 | } | ||
739 | |||
734 | SYSCALL_DEFINE5(preadv, unsigned long, fd, const struct iovec __user *, vec, | 740 | SYSCALL_DEFINE5(preadv, unsigned long, fd, const struct iovec __user *, vec, |
735 | unsigned long, vlen, u32, pos_high, u32, pos_low) | 741 | unsigned long, vlen, unsigned long, pos_l, unsigned long, pos_h) |
736 | { | 742 | { |
737 | loff_t pos = ((loff_t)pos_high << 32) | pos_low; | 743 | loff_t pos = pos_from_hilo(pos_h, pos_l); |
738 | struct file *file; | 744 | struct file *file; |
739 | ssize_t ret = -EBADF; | 745 | ssize_t ret = -EBADF; |
740 | int fput_needed; | 746 | int fput_needed; |
@@ -757,9 +763,9 @@ SYSCALL_DEFINE5(preadv, unsigned long, fd, const struct iovec __user *, vec, | |||
757 | } | 763 | } |
758 | 764 | ||
759 | SYSCALL_DEFINE5(pwritev, unsigned long, fd, const struct iovec __user *, vec, | 765 | SYSCALL_DEFINE5(pwritev, unsigned long, fd, const struct iovec __user *, vec, |
760 | unsigned long, vlen, u32, pos_high, u32, pos_low) | 766 | unsigned long, vlen, unsigned long, pos_l, unsigned long, pos_h) |
761 | { | 767 | { |
762 | loff_t pos = ((loff_t)pos_high << 32) | pos_low; | 768 | loff_t pos = pos_from_hilo(pos_h, pos_l); |
763 | struct file *file; | 769 | struct file *file; |
764 | ssize_t ret = -EBADF; | 770 | ssize_t ret = -EBADF; |
765 | int fput_needed; | 771 | int fput_needed; |
diff --git a/include/linux/compat.h b/include/linux/compat.h index 9723edd6455c..f2ded21f9a3c 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h | |||
@@ -193,10 +193,10 @@ asmlinkage ssize_t compat_sys_writev(unsigned long fd, | |||
193 | const struct compat_iovec __user *vec, unsigned long vlen); | 193 | const struct compat_iovec __user *vec, unsigned long vlen); |
194 | asmlinkage ssize_t compat_sys_preadv(unsigned long fd, | 194 | asmlinkage ssize_t compat_sys_preadv(unsigned long fd, |
195 | const struct compat_iovec __user *vec, | 195 | const struct compat_iovec __user *vec, |
196 | unsigned long vlen, u32 pos_high, u32 pos_low); | 196 | unsigned long vlen, u32 pos_low, u32 pos_high); |
197 | asmlinkage ssize_t compat_sys_pwritev(unsigned long fd, | 197 | asmlinkage ssize_t compat_sys_pwritev(unsigned long fd, |
198 | const struct compat_iovec __user *vec, | 198 | const struct compat_iovec __user *vec, |
199 | unsigned long vlen, u32 pos_high, u32 pos_low); | 199 | unsigned long vlen, u32 pos_low, u32 pos_high); |
200 | 200 | ||
201 | int compat_do_execve(char * filename, compat_uptr_t __user *argv, | 201 | int compat_do_execve(char * filename, compat_uptr_t __user *argv, |
202 | compat_uptr_t __user *envp, struct pt_regs * regs); | 202 | compat_uptr_t __user *envp, struct pt_regs * regs); |
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index b299a82a05e7..18771cac2f85 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h | |||
@@ -462,9 +462,9 @@ asmlinkage long sys_pread64(unsigned int fd, char __user *buf, | |||
462 | asmlinkage long sys_pwrite64(unsigned int fd, const char __user *buf, | 462 | asmlinkage long sys_pwrite64(unsigned int fd, const char __user *buf, |
463 | size_t count, loff_t pos); | 463 | size_t count, loff_t pos); |
464 | asmlinkage long sys_preadv(unsigned long fd, const struct iovec __user *vec, | 464 | asmlinkage long sys_preadv(unsigned long fd, const struct iovec __user *vec, |
465 | unsigned long vlen, u32 pos_high, u32 pos_low); | 465 | unsigned long vlen, unsigned long pos_l, unsigned long pos_h); |
466 | asmlinkage long sys_pwritev(unsigned long fd, const struct iovec __user *vec, | 466 | asmlinkage long sys_pwritev(unsigned long fd, const struct iovec __user *vec, |
467 | unsigned long vlen, u32 pos_high, u32 pos_low); | 467 | unsigned long vlen, unsigned long pos_l, unsigned long pos_h); |
468 | asmlinkage long sys_getcwd(char __user *buf, unsigned long size); | 468 | asmlinkage long sys_getcwd(char __user *buf, unsigned long size); |
469 | asmlinkage long sys_mkdir(const char __user *pathname, int mode); | 469 | asmlinkage long sys_mkdir(const char __user *pathname, int mode); |
470 | asmlinkage long sys_chdir(const char __user *filename); | 470 | asmlinkage long sys_chdir(const char __user *filename); |