RDMA/iw_cxgb4: Fix the unchecked ep dereference
authorRaju Rangoju <rajur@chelsio.com>
Fri, 11 Jan 2019 14:57:18 +0000 (20:27 +0530)
committerJason Gunthorpe <jgg@mellanox.com>
Tue, 15 Jan 2019 22:51:46 +0000 (15:51 -0700)
The patch 944661dd97f4: "RDMA/iw_cxgb4: atomically lookup ep and get a
reference" from May 6, 2016, leads to the following Smatch complaint:

    drivers/infiniband/hw/cxgb4/cm.c:2953 terminate()
    error: we previously assumed 'ep' could be null (see line 2945)

Fixes: 944661dd97f4 ("RDMA/iw_cxgb4: atomically lookup ep and get a reference")
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Raju Rangoju <rajur@chelsio.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/hw/cxgb4/cm.c

index 8221813..59917eb 100644 (file)
@@ -2942,15 +2942,18 @@ static int terminate(struct c4iw_dev *dev, struct sk_buff *skb)
 
        ep = get_ep_from_tid(dev, tid);
 
-       if (ep && ep->com.qp) {
-               pr_warn("TERM received tid %u qpid %u\n",
-                       tid, ep->com.qp->wq.sq.qid);
-               attrs.next_state = C4IW_QP_STATE_TERMINATE;
-               c4iw_modify_qp(ep->com.qp->rhp, ep->com.qp,
-                              C4IW_QP_ATTR_NEXT_STATE, &attrs, 1);
+       if (ep) {
+               if (ep->com.qp) {
+                       pr_warn("TERM received tid %u qpid %u\n", tid,
+                               ep->com.qp->wq.sq.qid);
+                       attrs.next_state = C4IW_QP_STATE_TERMINATE;
+                       c4iw_modify_qp(ep->com.qp->rhp, ep->com.qp,
+                                      C4IW_QP_ATTR_NEXT_STATE, &attrs, 1);
+               }
+
+               c4iw_put_ep(&ep->com);
        } else
                pr_warn("TERM received tid %u no ep/qp\n", tid);
-       c4iw_put_ep(&ep->com);
 
        return 0;
 }