605c811 BPF: fix FIELD_EXISTS relocation with array subscripts

Authored and Committed by Yonghong Song 2 years ago
    BPF: fix FIELD_EXISTS relocation with array subscripts
    
    Lorenz Bauer reported an issue in bpf mailing list ([1]) where
    for FIELD_EXISTS relocation, if the object is an array subscript,
    the patched immediate is the object offset from the base address,
    instead of 1.
    
    Currently in BPF AbstractMemberAccess pass, the final offset
    from the base address is the patched offset except FIELD_EXISTS
    which is 1 unconditionally. In this particular case, the last
    data structure access is not a field (struct/union offset)
    so it didn't hit the place to set patched immediate to be 1.
    
    This patch fixed the issue by checking the relocation type.
    If the type is FIELD_EXISTS, just set to 1.
    Tested by modifying some bpf selftests, libbpf is okay with
    such types with FIELD_EXISTS relocation.
    
     [1] https://lore.kernel.org/bpf/CACAyw99n-cMEtVst7aK-3BfHb99GMEChmRLCvhrjsRpHhPrtvA@mail.gmail.com/
    
    Differential Revision: https://reviews.llvm.org/D102036