• Arnd Bergmann's avatar
    lp: support 64-bit time_t user space · 9a450484
    Arnd Bergmann authored
    Once we get a glibc with 64-bit time_t, the LPSETTIMEOUT ioctl stops
    working, since the command number and data structure no longer match.
    
    To work around that, this introduces a new command number LPSETTIMEOUT_NEW
    that is used whenever the modified user space evaluates the LPSETTIMEOUT
    macro.
    
    The trick we use is a bit convoluted but necessary: we cannot check for
    any macros set by the C library in linux/lp.h, because this particular
    header can be included before including sys/time.h. However, we can assume
    that by the time that LPSETTIMEOUT is seen in the code, the definition
    for 'timeval' and 'time_t' has been seen as well, so we can use the
    sizeof() operator to determine whether we should use the old or the
    new definition. We use the old one not only for traditional 32-bit user
    space with 32-bit time_t, but also for all 64-bit architectures and x32,
    which always use a 64-bit time_t, the new definition will be used only for
    32-bit user space with 64-bit time_t, which also requires a newer kernel.
    
    The compat_ioctl() handler now implements both commands, but has to
    use a special case for existing x32 binaries. The native ioctl handler
    now implements both command numbers on both 32-bit and 64-bit, though
    the latter version use the same interpretation for both.
    
    This is based on an earlier patch from Bamvor.
    
    Cc: Bamvor Jian Zhang <bamv2005@gmail.com>
    Link: http://www.spinics.net/lists/y2038/msg01162.htmlSigned-off-by: default avatarArnd Bergmann <arnd@arndb.de>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    9a450484
lp.c 27.2 KB