android_kernel_oneplus_msm8998/net/sunrpc/xprtrdma
Chuck Lever 9b1dcbc8cf xprtrdma: Store RDMA credits in unsigned variables
Dan Carpenter's static checker pointed out:

   net/sunrpc/xprtrdma/rpc_rdma.c:879 rpcrdma_reply_handler()
   warn: can 'credits' be negative?

"credits" is defined as an int. The credits value comes from the
server as a 32-bit unsigned integer.

A malicious or broken server can plant a large unsigned integer in
that field which would result in an underflow in the following
logic, potentially triggering a deadlock of the mount point by
blocking the client from issuing more RPC requests.

net/sunrpc/xprtrdma/rpc_rdma.c:

  876          credits = be32_to_cpu(headerp->rm_credit);
  877          if (credits == 0)
  878                  credits = 1;    /* don't deadlock */
  879          else if (credits > r_xprt->rx_buf.rb_max_requests)
  880                  credits = r_xprt->rx_buf.rb_max_requests;
  881
  882          cwnd = xprt->cwnd;
  883          xprt->cwnd = credits << RPC_CWNDSHIFT;
  884          if (xprt->cwnd > cwnd)
  885                  xprt_release_rqst_cong(rqst->rq_task);

Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Fixes: eba8ff660b ("xprtrdma: Move credit update to RPC . . .")
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
2015-02-23 16:54:04 -05:00
..
Makefile xprtrdma: add separate Kconfig options for NFSoRDMA client and server support 2014-03-28 18:02:12 -04:00
rpc_rdma.c xprtrdma: Store RDMA credits in unsigned variables 2015-02-23 16:54:04 -05:00
svc_rdma.c net: Convert uses of typedef ctl_table to struct ctl_table 2013-06-13 02:36:09 -07:00
svc_rdma_marshal.c svcrdma: underflow issue in decode_write_list() 2013-07-15 11:46:23 -04:00
svc_rdma_recvfrom.c svcrdma: Add zero padding if the client doesn't send it 2014-07-22 16:40:21 -04:00
svc_rdma_sendto.c svcrdma: send_write() must not overflow the device's max sge 2014-07-11 15:03:48 -04:00
svc_rdma_transport.c svcrdma: advertise the correct max payload 2014-09-29 14:35:18 -04:00
transport.c xprtrdma: Update the GFP flags used in xprt_rdma_allocate() 2015-01-30 12:18:48 -05:00
verbs.c xprtrdma: Clean up after adding regbuf management 2015-01-30 10:47:49 -05:00
xprt_rdma.h xprtrdma: Store RDMA credits in unsigned variables 2015-02-23 16:54:04 -05:00