All of lore.kernel.org
 help / color / mirror / Atom feed
* Sign extension problem in llseek(2)
@ 2009-03-24 18:24 Ralf Baechle
  0 siblings, 0 replies; only message in thread
From: Ralf Baechle @ 2009-03-24 18:24 UTC (permalink / raw)
  To: linux-arch; +Cc: dann frazier, linux-mips

In fs/read_write.c:

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,
                        origin);
 
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
e2fsck:

[...]
                          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>?
[...]

  Ralf

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2009-03-24 18:24 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-03-24 18:24 Sign extension problem in llseek(2) Ralf Baechle

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.