• Daniel Borkmann's avatar
    bpf: fix bpf_trace_printk on 32 bit archs · d6a6b6b4
    Daniel Borkmann authored
    
    [ Upstream commit 88a5c690 ]
    
    James reported that on MIPS32 bpf_trace_printk() is currently
    broken while MIPS64 works fine:
    
      bpf_trace_printk() uses conditional operators to attempt to
      pass different types to __trace_printk() depending on the
      format operators. This doesn't work as intended on 32-bit
      architectures where u32 and long are passed differently to
      u64, since the result of C conditional operators follows the
      "usual arithmetic conversions" rules, such that the values
      passed to __trace_printk() will always be u64 [causing issues
      later in the va_list handling for vscnprintf()].
    
      For example the samples/bpf/tracex5 test printed lines like
      below on MIPS32, where the fd and buf have come from the u64
      fd argument, and the size from the buf argument:
    
        [...] 1180.941542: 0x00000001: write(fd=1, buf=  (null), size=6258688)
    
      Instead of this:
    
        [...] 1625.616026: 0x00000001: write(fd=1, buf=009e4000, size=512)
    
    One way to get it working is to expand various combinations
    of argument types into 8 different combinations for 32 bit
    and 64 bit kernels. Fix tested by James on MIPS32 and MIPS64
    as well that it resolves the issue.
    
    Fixes: 9c959c86 ("tracing: Allow BPF programs to call bpf_trace_printk()")
    Reported-by: default avatarJames Hogan <james.hogan@imgtec.com>
    Tested-by: default avatarJames Hogan <james.hogan@imgtec.com>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    d6a6b6b4
bpf_trace.c 16.9 KB