mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-11-19 08:05:27 +08:00
tile: work around bug in the generic sys_llseek
sys_llseek should specify the high and low 32-bit seek values as "unsigned int" but instead it specifies "unsigned long". Since compat syscall arguments are always sign-extended on tile, this means that a seek value of 0xffffffff will be incorrectly interpreted as a value of -1ULL. To avoid the risk of breaking binary compatibility on architectures that already use sys_llseek this way, we follow the same path as MIPS and provide a wrapper override. Signed-off-by: Chris Metcalf <cmetcalf@tilera.com> Cc: stable@kernel.org [v3.6 onwards]
This commit is contained in:
parent
6dbe51c251
commit
5a114b9866
@ -288,6 +288,9 @@ long compat_sys_sync_file_range2(int fd, unsigned int flags,
|
|||||||
long compat_sys_fallocate(int fd, int mode,
|
long compat_sys_fallocate(int fd, int mode,
|
||||||
u32 offset_lo, u32 offset_hi,
|
u32 offset_lo, u32 offset_hi,
|
||||||
u32 len_lo, u32 len_hi);
|
u32 len_lo, u32 len_hi);
|
||||||
|
long compat_sys_llseek(unsigned int fd, unsigned int offset_high,
|
||||||
|
unsigned int offset_low, loff_t __user * result,
|
||||||
|
unsigned int origin);
|
||||||
|
|
||||||
/* Assembly trampoline to avoid clobbering r0. */
|
/* Assembly trampoline to avoid clobbering r0. */
|
||||||
long _compat_sys_rt_sigreturn(void);
|
long _compat_sys_rt_sigreturn(void);
|
||||||
|
@ -76,6 +76,18 @@ long compat_sys_fallocate(int fd, int mode,
|
|||||||
((loff_t)len_hi << 32) | len_lo);
|
((loff_t)len_hi << 32) | len_lo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Avoid bug in generic sys_llseek() that specifies offset_high and
|
||||||
|
* offset_low as "unsigned long", thus making it possible to pass
|
||||||
|
* a sign-extended high 32 bits in offset_low.
|
||||||
|
*/
|
||||||
|
long compat_sys_llseek(unsigned int fd, unsigned int offset_high,
|
||||||
|
unsigned int offset_low, loff_t __user * result,
|
||||||
|
unsigned int origin)
|
||||||
|
{
|
||||||
|
return sys_llseek(fd, offset_high, offset_low, result, origin);
|
||||||
|
}
|
||||||
|
|
||||||
/* Provide the compat syscall number to call mapping. */
|
/* Provide the compat syscall number to call mapping. */
|
||||||
#undef __SYSCALL
|
#undef __SYSCALL
|
||||||
#define __SYSCALL(nr, call) [nr] = (call),
|
#define __SYSCALL(nr, call) [nr] = (call),
|
||||||
@ -83,6 +95,7 @@ long compat_sys_fallocate(int fd, int mode,
|
|||||||
/* See comments in sys.c */
|
/* See comments in sys.c */
|
||||||
#define compat_sys_fadvise64_64 sys32_fadvise64_64
|
#define compat_sys_fadvise64_64 sys32_fadvise64_64
|
||||||
#define compat_sys_readahead sys32_readahead
|
#define compat_sys_readahead sys32_readahead
|
||||||
|
#define sys_llseek compat_sys_llseek
|
||||||
|
|
||||||
/* Call the assembly trampolines where necessary. */
|
/* Call the assembly trampolines where necessary. */
|
||||||
#define compat_sys_rt_sigreturn _compat_sys_rt_sigreturn
|
#define compat_sys_rt_sigreturn _compat_sys_rt_sigreturn
|
||||||
|
Loading…
Reference in New Issue
Block a user