Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma

Pull rdma fixes from Doug Ledford:
"We had a few more items creep up over the last week. Given we are in
-rc8, these are obviously limited to bugs that have a big downside and
for which we are certain of the fix.

The first is a straight up oops bug that all you have to do is read
the code to see it's a guaranteed 100% oops bug.

The second is a use-after-free issue. We get away lucky if the queue
we are shutting down is empty, but if it isn't, we can end up oopsing.
We really need to drain the queue before destroying it.

The final one is an issue with bad user input causing us to access our
port array out of bounds. While fixing the array out of bounds issue,
it was noticed that the original code did the same thing twice (the
call to rdma_ah_set_port_num()), so its removal is not balanced by a
readd elsewhere, it was already where it needed to be in addition to
where it didn't need to be.

Summary:

- Oops fix in hfi1 driver

- use-after-free issue in iser-target

- use of user supplied array index without proper checking"

* tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma:
RDMA/mlx5: Fix out-of-bound access while querying AH
IB/hfi1: Prevent a NULL dereference
iser-target: Fix possible use-after-free in connection establishment error

+6 -6
+2 -2
drivers/infiniband/hw/hfi1/file_ops.c
··· 763 763 } 764 764 765 765 if (ret) { 766 - hfi1_rcd_put(fd->uctxt); 767 - fd->uctxt = NULL; 768 766 spin_lock_irqsave(&fd->dd->uctxt_lock, flags); 769 767 __clear_bit(fd->subctxt, fd->uctxt->in_use_ctxts); 770 768 spin_unlock_irqrestore(&fd->dd->uctxt_lock, flags); 769 + hfi1_rcd_put(fd->uctxt); 770 + fd->uctxt = NULL; 771 771 } 772 772 773 773 return ret;
+3 -4
drivers/infiniband/hw/mlx5/qp.c
··· 4362 4362 4363 4363 memset(ah_attr, 0, sizeof(*ah_attr)); 4364 4364 4365 - ah_attr->type = rdma_ah_find_type(&ibdev->ib_dev, path->port); 4366 - rdma_ah_set_port_num(ah_attr, path->port); 4367 - if (rdma_ah_get_port_num(ah_attr) == 0 || 4368 - rdma_ah_get_port_num(ah_attr) > MLX5_CAP_GEN(dev, num_ports)) 4365 + if (!path->port || path->port > MLX5_CAP_GEN(dev, num_ports)) 4369 4366 return; 4367 + 4368 + ah_attr->type = rdma_ah_find_type(&ibdev->ib_dev, path->port); 4370 4369 4371 4370 rdma_ah_set_port_num(ah_attr, path->port); 4372 4371 rdma_ah_set_sl(ah_attr, path->dci_cfi_prio_sl & 0xf);
+1
drivers/infiniband/ulp/isert/ib_isert.c
··· 741 741 { 742 742 struct isert_conn *isert_conn = cma_id->qp->qp_context; 743 743 744 + ib_drain_qp(isert_conn->qp); 744 745 list_del_init(&isert_conn->node); 745 746 isert_conn->cm_id = NULL; 746 747 isert_put_conn(isert_conn);