• Anton Blanchard's avatar
    powerpc/vdso64: Use double word compare on pointers · a35222e8
    Anton Blanchard authored
    commit 5045ea37 upstream.
    
    __kernel_get_syscall_map() and __kernel_clock_getres() use cmpli to
    check if the passed in pointer is non zero. cmpli maps to a 32 bit
    compare on binutils, so we ignore the top 32 bits.
    
    A simple test case can be created by passing in a bogus pointer with
    the bottom 32 bits clear. Using a clk_id that is handled by the VDSO,
    then one that is handled by the kernel shows the problem:
    
      printf("%d\n", clock_getres(CLOCK_REALTIME, (void *)0x100000000));
      printf("%d\n", clock_getres(CLOCK_BOOTTIME, (void *)0x100000000));
    
    And we get:
    
      0
      -1
    
    The bigger issue is if we pass a valid pointer with the bottom 32 bits
    clear, in this case we will return success but won't write any data
    to the pointer.
    
    I stumbled across this issue because the LLVM integrated assembler
    doesn't accept cmpli with 3 arguments. Fix this by converting them to
    cmpldi.
    
    Fixes: a7f290da ("[PATCH] powerpc: Merge vdso's and add vdso support to 32 bits kernel")
    Signed-off-by: default avatarAnton Blanchard <anton@samba.org>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
    a35222e8
gettimeofday.S 5.67 KB