]> git.kernelconcepts.de Git - karo-tx-linux.git/commit
firewire: cdev: fix 32 bit userland on 64 bit kernel compat corner cases
authorStefan Richter <stefanr@s5r6.in-berlin.de>
Wed, 10 Aug 2011 22:06:04 +0000 (00:06 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 19 Mar 2012 15:57:43 +0000 (08:57 -0700)
commit4995a6913d6ada9672179736affd5606f2281edb
tree9b52054a57787d48f497ff85c6fb950eb426245a
parent9217bfbbade56ef9dfee88773c2105e619028fa1
firewire: cdev: fix 32 bit userland on 64 bit kernel compat corner cases

commit 9c1176b6a28850703ea6e3a0f0c703f6d6c61cd3 upstream.

Clemens points out that we need to use compat_ptr() in order to safely
cast from u64 to addresses of a 32-bit usermode client.

Before, our conversion went wrong
  - in practice if the client cast from pointer to integer such that
    sign-extension happened, (libraw1394 and libdc1394 at least were not
    doing that, IOW were not affected)
or
  - in theory on s390 (which doesn't have FireWire though) and on the
    tile architecture, regardless of what the client does.
The bug would usually be observed as the initial get_info ioctl failing
with "Bad address" (EFAULT).

Reported-by: Carl Karsten <carl@personnelware.com>
Reported-by: Clemens Ladisch <clemens@ladisch.de>
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/firewire/core-cdev.c