• Arnd Bergmann's avatar
    y2038: asm-generic: Extend sysvipc data structures · f991f015
    Arnd Bergmann authored
    Most architectures now use the asm-generic copy of the sysvipc data
    structures (msqid64_ds, semid64_ds, shmid64_ds), which use 32-bit
    __kernel_time_t on 32-bit architectures but have padding behind them to
    allow extending the type to 64-bit.
    
    Unfortunately, that fails on all big-endian architectures, which have the
    padding on the wrong side. As so many of them get it wrong, we decided to
    not bother even trying to fix it up when we introduced the asm-generic
    copy. Instead we always use the padding word now to provide the upper
    32 bits of the seconds value, regardless of the endianess.
    
    A libc implementation on a typical big-endian system can deal with
    this by providing its own copy of the structure definition to user
    space, and swapping the two 32-bit words before returning from the
    semctl/shmctl/msgctl system calls.
    
    Note that msqid64_ds and shmid64_ds were broken on x32 since commit
    f4b4aae1 ("x86/headers/uapi: Fix __BITS_PER_LONG value for x32
    builds"). I have sent a separate fix for that, but as we no longer
    have to worry about x32 here, I no longer worry about x32 here and
    use 'unsigned long' instead of __kernel_ulong_t.
    Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
    f991f015
sembuf.h 1.51 KB