summaryrefslogtreecommitdiffstats
path: root/net/sunrpc
diff options
context:
space:
mode:
authorChuck Lever <chuck.lever@oracle.com>2017-10-16 15:01:06 -0400
committerAnna Schumaker <Anna.Schumaker@Netapp.com>2017-11-17 13:47:53 -0500
commit61433af56077f5fd8815281b44938d84feb04687 (patch)
tree3fc82e93f1cf8e68d39b4b02e1c563b024357d32 /net/sunrpc
parent2b4f8923ecaafc0c25ee56bc17ea9256d12b747c (diff)
downloadlinux-61433af56077f5fd8815281b44938d84feb04687.tar.bz2
xprtrdma: Throw away reply when version is unrecognized
A reply with an unrecognized value in the version field means the transport header is potentially garbled and therefore all the fields are untrustworthy. Fixes: 59aa1f9a3cce3 ("xprtrdma: Properly handle RDMA_ERROR ... ") Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
Diffstat (limited to 'net/sunrpc')
-rw-r--r--net/sunrpc/xprtrdma/rpc_rdma.c17
1 files changed, 8 insertions, 9 deletions
diff --git a/net/sunrpc/xprtrdma/rpc_rdma.c b/net/sunrpc/xprtrdma/rpc_rdma.c
index f1889f4d4803..20c9e4cbaa73 100644
--- a/net/sunrpc/xprtrdma/rpc_rdma.c
+++ b/net/sunrpc/xprtrdma/rpc_rdma.c
@@ -1248,6 +1248,9 @@ rpcrdma_reply_handler(struct work_struct *work)
p++; /* credits */
proc = *p++;
+ if (vers != rpcrdma_version)
+ goto out_badversion;
+
if (rpcrdma_is_bcall(r_xprt, rep, xid, proc))
return;
@@ -1280,8 +1283,6 @@ rpcrdma_reply_handler(struct work_struct *work)
}
xprt->reestablish_timeout = 0;
- if (vers != rpcrdma_version)
- goto out_badversion;
switch (proc) {
case rdma_msg:
@@ -1321,17 +1322,15 @@ out_badstatus:
}
return;
-/* If the incoming reply terminated a pending RPC, the next
- * RPC call will post a replacement receive buffer as it is
- * being marshaled.
- */
out_badversion:
dprintk("RPC: %s: invalid version %d\n",
__func__, be32_to_cpu(vers));
- status = -EIO;
- r_xprt->rx_stats.bad_reply_count++;
- goto out;
+ goto repost;
+/* If the incoming reply terminated a pending RPC, the next
+ * RPC call will post a replacement receive buffer as it is
+ * being marshaled.
+ */
out_badheader:
dprintk("RPC: %5u %s: invalid rpcrdma reply (type %u)\n",
rqst->rq_task->tk_pid, __func__, be32_to_cpu(proc));