• Al Viro's avatar
    fix rawctl compat ioctls breakage on amd64 and itanic · c4a04727
    Al Viro authored
    RAW_SETBIND and RAW_GETBIND 32bit versions are fscked in interesting ways.
    
    1) fs/compat_ioctl.c has COMPATIBLE_IOCTL(RAW_SETBIND) followed by
    HANDLE_IOCTL(RAW_SETBIND, raw_ioctl).  The latter is ignored.
    
    2) on amd64 (and itanic) the damn thing is broken - we have int + u64 + u64
    and layouts on i386 and amd64 are _not_ the same.  raw_ioctl() would
    work there, but it's never called due to (1).  As it is, i386 /sbin/raw
    definitely doesn't work on amd64 boxen.
    
    3) switching to raw_ioctl() as is would *not* work on e.g. sparc64 and ppc64,
    which would be rather sad, seeing that normal userland there is 32bit.
    The thing is, slapping __packed on the struct in question does not DTRT -
    it eliminates *all* padding.  The real solution is to use compat_u64.
    
    4) of course, all that stuff has no business being outside of raw.c in the
    first place - there should be ->compat_ioctl() for /dev/rawctl instead of
    messing with compat_ioctl.c.
    
    [akpm@linux-foundation.org: coding-style fixes]
    [arnd@arndb.de: port to 2.6.36]
    Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
    c4a04727
compat_ioctl.c 46.4 KB