• Chuck Lever's avatar
    SUNRPC: Fix the svc_deferred_event trace class · 4d500445
    Chuck Lever authored
    Fix a NULL deref crash that occurs when an svc_rqst is deferred
    while the sunrpc tracing subsystem is enabled. svc_revisit() sets
    dr->xprt to NULL, so it can't be relied upon in the tracepoint to
    provide the remote's address.
    
    Unfortunately we can't revert the "svc_deferred_class" hunk in
    commit ece200dd ("sunrpc: Save remote presentation address in
    svc_xprt for trace events") because there is now a specific check
    of event format specifiers for unsafe dereferences. The warning
    that check emits is:
    
      event svc_defer_recv has unsafe dereference of argument 1
    
    A "%pISpc" format specifier with a "struct sockaddr *" is indeed
    flagged by this check.
    
    Instead, take the brute-force approach used by the svcrdma_qp_error
    tracepoint. Convert the dr::addr field into a presentation address
    in the TP_fast_assign() arm of the trace event, and store that as
    a string. This fix can be backported to -stable kernels.
    
    In the meantime, commit c6ced229 ("tracing: Update print fmt
    check to handle new __get_sockaddr() macro") is now in v5.18, so
    this wonky fix can be replaced with __sockaddr() and friends
    properly during the v5.19 merge window.
    
    Fixes: ece200dd ("sunrpc: Save remote presentation address in svc_xprt for trace events")
    Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
    4d500445
sunrpc.h 56.3 KB