SYSCALL_DEFINE5(llseek, unsigned int, fd, unsigned long, offset_high,
unsigned long, offset_low, loff_t __user *, result,
unsigned int, origin)
offset = vfs_llseek(file, ((loff_t) offset_high << 32) | offset_low,
On a 64-bit system that define CONFIG_HAVE_SYSCALL_WRAPPERS SYSCALL_DEFINEx
will truncate long arguments to 32-bit and on some architectures such as
MIPS sign-extended to 64-bit again. On such architectures passing a
value with bit 31 in offset_low set will result in a huge 64-bit offset
being passed to vfs_llseek() and it failiing with EINVAL.
MIPS is affected by this issue. Other 64-bit architectures which also
set CONFIG_HAVE_SYSCALL_WRAPPERS and __ARCH_WANT_SYS_LLSEEK are PowerPC,
S390 and sparc.
The issue was discovered on Debian's MIPS infrastructure machines running
This was noticed on one of the Debian
infrastructure machines where, after an upgrade, e2fsck began failing
with errors like:
Error reading block 524290 (Invalid argument) while getting next inode
from scan. Ignore error<y>?