]> git.baikalelectronics.ru Git - kernel.git/commit
SUNRPC: Fix the svc_deferred_event trace class
authorChuck Lever <chuck.lever@oracle.com>
Wed, 6 Apr 2022 17:51:32 +0000 (13:51 -0400)
committerChuck Lever <chuck.lever@oracle.com>
Thu, 7 Apr 2022 14:22:51 +0000 (10:22 -0400)
commit81a27d87145fe535d15c16cccb750944f04703bd
treeebc22ea61cad0ed0384e6ee9d818f47754d89e6a
parentd75b7821a167a86821daef6234f63717948e54ec
SUNRPC: Fix the svc_deferred_event trace class

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 4f943ed1e368 ("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 03dc03720c8e ("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: 4f943ed1e368 ("sunrpc: Save remote presentation address in svc_xprt for trace events")
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
include/trace/events/sunrpc.h