]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
SUNRPC: Fix a NULL pointer deref in trace_svc_stats_latency()
authorChuck Lever <chuck.lever@oracle.com>
Thu, 5 Aug 2021 19:11:24 +0000 (15:11 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 15 Sep 2021 08:00:48 +0000 (10:00 +0200)
[ Upstream commit 5c11720767f70d34357d00a15ba5a0ad052c40fe ]

Some paths through svc_process() leave rqst->rq_procinfo set to
NULL, which triggers a crash if tracing happens to be enabled.

Fixes: 89ff87494c6e ("SUNRPC: Display RPC procedure names instead of proc numbers")
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
include/linux/sunrpc/svc.h
include/trace/events/sunrpc.h
net/sunrpc/svc.c

index e91d51ea028bb7c4a772956eed58c567e4c92525..65185d1e07ea6b812e4628e31d92f7d26a9deef4 100644 (file)
@@ -523,6 +523,7 @@ void                   svc_wake_up(struct svc_serv *);
 void              svc_reserve(struct svc_rqst *rqstp, int space);
 struct svc_pool *  svc_pool_for_cpu(struct svc_serv *serv, int cpu);
 char *            svc_print_addr(struct svc_rqst *, char *, size_t);
+const char *      svc_proc_name(const struct svc_rqst *rqstp);
 int               svc_encode_result_payload(struct svc_rqst *rqstp,
                                             unsigned int offset,
                                             unsigned int length);
index d02e01a27b690e62890ae2329c8e7891ba495f63..87569dbf2fe787cd1421bce1dcb8da8d0c977567 100644 (file)
@@ -1642,7 +1642,7 @@ TRACE_EVENT(svc_process,
                __field(u32, vers)
                __field(u32, proc)
                __string(service, name)
-               __string(procedure, rqst->rq_procinfo->pc_name)
+               __string(procedure, svc_proc_name(rqst))
                __string(addr, rqst->rq_xprt ?
                         rqst->rq_xprt->xpt_remotebuf : "(null)")
        ),
@@ -1652,7 +1652,7 @@ TRACE_EVENT(svc_process,
                __entry->vers = rqst->rq_vers;
                __entry->proc = rqst->rq_proc;
                __assign_str(service, name);
-               __assign_str(procedure, rqst->rq_procinfo->pc_name);
+               __assign_str(procedure, svc_proc_name(rqst));
                __assign_str(addr, rqst->rq_xprt ?
                             rqst->rq_xprt->xpt_remotebuf : "(null)");
        ),
@@ -1918,7 +1918,7 @@ TRACE_EVENT(svc_stats_latency,
        TP_STRUCT__entry(
                __field(u32, xid)
                __field(unsigned long, execute)
-               __string(procedure, rqst->rq_procinfo->pc_name)
+               __string(procedure, svc_proc_name(rqst))
                __string(addr, rqst->rq_xprt->xpt_remotebuf)
        ),
 
@@ -1926,7 +1926,7 @@ TRACE_EVENT(svc_stats_latency,
                __entry->xid = be32_to_cpu(rqst->rq_xid);
                __entry->execute = ktime_to_us(ktime_sub(ktime_get(),
                                                         rqst->rq_stime));
-               __assign_str(procedure, rqst->rq_procinfo->pc_name);
+               __assign_str(procedure, svc_proc_name(rqst));
                __assign_str(addr, rqst->rq_xprt->xpt_remotebuf);
        ),
 
index 0de918cb3d90da4842fdb0facc54ac2f8b0ddc5a..a47e290b0668e255c4331ba6e4f5fc9b257e447b 100644 (file)
@@ -1629,6 +1629,21 @@ u32 svc_max_payload(const struct svc_rqst *rqstp)
 }
 EXPORT_SYMBOL_GPL(svc_max_payload);
 
+/**
+ * svc_proc_name - Return RPC procedure name in string form
+ * @rqstp: svc_rqst to operate on
+ *
+ * Return value:
+ *   Pointer to a NUL-terminated string
+ */
+const char *svc_proc_name(const struct svc_rqst *rqstp)
+{
+       if (rqstp && rqstp->rq_procinfo)
+               return rqstp->rq_procinfo->pc_name;
+       return "unknown";
+}
+
+
 /**
  * svc_encode_result_payload - mark a range of bytes as a result payload
  * @rqstp: svc_rqst to operate on