Skip to content
  • Arnd Bergmann's avatar
    can: avoid using timeval for uapi · ba61a8d9
    Arnd Bergmann authored
    
    
    The can subsystem communicates with user space using a bcm_msg_head
    header, which contains two timestamps. This is problematic for
    multiple reasons:
    
    a) The structure layout is currently incompatible between 64-bit
       user space and 32-bit user space, and cannot work in compat
       mode (other than x32).
    
    b) The timeval structure layout will change in 32-bit user
       space when we fix the y2038 overflow problem by redefining
       time_t to 64-bit, making new 32-bit user space incompatible
       with the current kernel interface.
       Cars last a long time and often use old kernels, so the actual
       users of this code are the most likely ones to migrate to y2038
       safe user space.
    
    This tries to work around part of the problem by changing the
    publicly visible user interface in the header, but not the binary
    interface. Fortunately, the values passed around in the structure
    are relative times and do not actually suffer from the y2038
    overflow, so 32-bit is enough here.
    
    We replace the use of 'struct timeval' with a newly defined
    'struct bcm_timeval' that uses the exact same binary layout
    as before and that still suffers from problem a) but not problem
    b).
    
    The downside of this approach is that any user space program
    that currently assigns a timeval structure to these members
    rather than writing the tv_sec/tv_usec portions individually
    will suffer a compile-time error when built with an updated
    kernel header. Fixing this error makes it work fine with old
    and new headers though.
    
    We could address problem a) by using '__u32' or 'int' members
    rather than 'long', but that would have a more significant
    downside in also breaking support for all existing 64-bit user
    binaries that might be using this interface, which is likely
    not acceptable.
    
    Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
    Acked-by: default avatarOliver Hartkopp <socketcan@hartkopp.net>
    Cc: linux-can@vger.kernel.org
    Cc: linux-api@vger.kernel.org
    Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
    ba61a8d9