• Arnd Bergmann's avatar
    ftruncate: pass a signed offset · 4b8e88e5
    Arnd Bergmann authored
    The old ftruncate() syscall, using the 32-bit off_t misses a sign
    extension when called in compat mode on 64-bit architectures.  As a
    result, passing a negative length accidentally succeeds in truncating
    to file size between 2GiB and 4GiB.
    
    Changing the type of the compat syscall to the signed compat_off_t
    changes the behavior so it instead returns -EINVAL.
    
    The native entry point, the truncate() syscall and the corresponding
    loff_t based variants are all correct already and do not suffer
    from this mistake.
    
    Fixes: 3f6d078d ("fix compat truncate/ftruncate")
    Reviewed-by: default avatarChristian Brauner <brauner@kernel.org>
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
    4b8e88e5
open.c 39.9 KB