Patch "SUNRPC: Fix the svc_deferred_event trace class" has been added to the 5.17-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    SUNRPC: Fix the svc_deferred_event trace class

to the 5.17-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     sunrpc-fix-the-svc_deferred_event-trace-class.patch
and it can be found in the queue-5.17 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 2e4bc3920c242098f592b49fd56b5e3ec2c90941
Author: Chuck Lever <chuck.lever@xxxxxxxxxx>
Date:   Wed Apr 6 13:51:32 2022 -0400

    SUNRPC: Fix the svc_deferred_event trace class
    
    [ Upstream commit 4d5004451ab2218eab94a30e1841462c9316ba19 ]
    
    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 ece200ddd54b ("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 c6ced22997ad ("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: ece200ddd54b ("sunrpc: Save remote presentation address in svc_xprt for trace events")
    Signed-off-by: Chuck Lever <chuck.lever@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/include/trace/events/sunrpc.h b/include/trace/events/sunrpc.h
index 5be3faf88c1a..06fe47fb3686 100644
--- a/include/trace/events/sunrpc.h
+++ b/include/trace/events/sunrpc.h
@@ -1956,17 +1956,18 @@ DECLARE_EVENT_CLASS(svc_deferred_event,
 	TP_STRUCT__entry(
 		__field(const void *, dr)
 		__field(u32, xid)
-		__string(addr, dr->xprt->xpt_remotebuf)
+		__array(__u8, addr, INET6_ADDRSTRLEN + 10)
 	),
 
 	TP_fast_assign(
 		__entry->dr = dr;
 		__entry->xid = be32_to_cpu(*(__be32 *)(dr->args +
 						       (dr->xprt_hlen>>2)));
-		__assign_str(addr, dr->xprt->xpt_remotebuf);
+		snprintf(__entry->addr, sizeof(__entry->addr) - 1,
+			 "%pISpc", (struct sockaddr *)&dr->addr);
 	),
 
-	TP_printk("addr=%s dr=%p xid=0x%08x", __get_str(addr), __entry->dr,
+	TP_printk("addr=%s dr=%p xid=0x%08x", __entry->addr, __entry->dr,
 		__entry->xid)
 );
 



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux