]> git.baikalelectronics.ru Git - kernel.git/commitdiff
xprtrdma: Throw away reply when version is unrecognized
authorChuck Lever <chuck.lever@oracle.com>
Mon, 16 Oct 2017 19:01:06 +0000 (15:01 -0400)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Fri, 17 Nov 2017 18:47:53 +0000 (13:47 -0500)
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>
net/sunrpc/xprtrdma/rpc_rdma.c

index f1889f4d48030f3a0a07eef6fa524bbc12580216..20c9e4cbaa737a743ca6c9dfb3416380da28db65 100644 (file)
@@ -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));