• Beau Belgrave's avatar
    tracing: Fix print_fields() for __dyn_loc/__rel_loc · c7bdb079
    Beau Belgrave authored
    Both print_fields() and print_array() do not handle if dynamic data ends
    at the last byte of the payload for both __dyn_loc and __rel_loc field
    types. For __rel_loc, the offset was off by 4 bytes, leading to
    incorrect strings and data being printed out. In print_array() the
    buffer pos was missed from being advanced, which results in the first
    payload byte being used as the offset base instead of the field offset.
    
    Advance __rel_loc offset by 4 to ensure correct offset and advance pos
    to the field offset to ensure correct data is displayed when printing
    arrays. Change >= to > when checking if data is in-bounds, since it's
    valid for dynamic data to include the last byte of the payload.
    
    Example outputs for event format:
            field:unsigned short common_type;       offset:0;       size:2; signed:0;
            field:unsigned char common_flags;       offset:2;       size:1; signed:0;
            field:unsigned char common_preempt_count;       offset:3;       size:1; signed:0;
            field:int common_pid;   offset:4;       size:4; signed:1;
    
            field:__rel_loc char text[];  offset:8;      size:4; signed:1;
    
    Output before:
    tp_rel_loc: text=<OVERFLOW>
    
    Output after:
    tp_rel_loc: text=Test
    
    Link: https://lkml.kernel.org/r/20230419214140.4158-3-beaub@linux.microsoft.com
    
    Fixes: 80a76994 ("tracing: Add "fields" option to show raw trace event fields")
    Reported-by: default avatarDoug Cook <dcook@linux.microsoft.com>
    Signed-off-by: default avatarBeau Belgrave <beaub@linux.microsoft.com>
    Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
    c7bdb079
trace_output.c 38.7 KB