Skip to content

Commit 4d0be1a

Browse files
committed
Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma
Pull rdma fixes from Jason Gunthorpe: "Four small fixes for crashes: - Double free in rxe - UAF in irdma from early freeing the rf - Off by one undoing the IRQ allocations during error unwind in irdma - Another race with device rename and uevent generation. uevents accesses the struct device name and UAF when it is changed" * tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma: RDMA/core: Fix "KASAN: slab-use-after-free Read in ib_register_device" problem ice, irdma: fix an off by one in error handling code irdma: free iwdev->rf after removing MSI-X RDMA/rxe: Fix slab-use-after-free Read in rxe_queue_cleanup bug
2 parents f1f2797 + d0706bf commit 4d0be1a

File tree

4 files changed

+8
-8
lines changed

4 files changed

+8
-8
lines changed

drivers/infiniband/core/device.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1352,6 +1352,9 @@ static void ib_device_notify_register(struct ib_device *device)
13521352

13531353
down_read(&devices_rwsem);
13541354

1355+
/* Mark for userspace that device is ready */
1356+
kobject_uevent(&device->dev.kobj, KOBJ_ADD);
1357+
13551358
ret = rdma_nl_notify_event(device, 0, RDMA_REGISTER_EVENT);
13561359
if (ret)
13571360
goto out;
@@ -1468,10 +1471,9 @@ int ib_register_device(struct ib_device *device, const char *name,
14681471
return ret;
14691472
}
14701473
dev_set_uevent_suppress(&device->dev, false);
1471-
/* Mark for userspace that device is ready */
1472-
kobject_uevent(&device->dev.kobj, KOBJ_ADD);
14731474

14741475
ib_device_notify_register(device);
1476+
14751477
ib_device_put(device);
14761478

14771479
return 0;

drivers/infiniband/hw/irdma/main.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ static int irdma_init_interrupts(struct irdma_pci_f *rf, struct ice_pf *pf)
221221
break;
222222

223223
if (i < IRDMA_MIN_MSIX) {
224-
for (; i > 0; i--)
224+
while (--i >= 0)
225225
ice_free_rdma_qvector(pf, &rf->msix_entries[i]);
226226

227227
kfree(rf->msix_entries);
@@ -255,6 +255,8 @@ static void irdma_remove(struct auxiliary_device *aux_dev)
255255
ice_rdma_update_vsi_filter(pf, iwdev->vsi_num, false);
256256
irdma_deinit_interrupts(iwdev->rf, pf);
257257

258+
kfree(iwdev->rf);
259+
258260
pr_debug("INIT: Gen2 PF[%d] device remove success\n", PCI_FUNC(pf->pdev->devfn));
259261
}
260262

drivers/infiniband/hw/irdma/verbs.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4871,5 +4871,4 @@ void irdma_ib_dealloc_device(struct ib_device *ibdev)
48714871

48724872
irdma_rt_deinit_hw(iwdev);
48734873
irdma_ctrl_deinit_hw(iwdev->rf);
4874-
kfree(iwdev->rf);
48754874
}

drivers/infiniband/sw/rxe/rxe_cq.c

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,8 @@ int rxe_cq_from_init(struct rxe_dev *rxe, struct rxe_cq *cq, int cqe,
5656

5757
err = do_mmap_info(rxe, uresp ? &uresp->mi : NULL, udata,
5858
cq->queue->buf, cq->queue->buf_size, &cq->queue->ip);
59-
if (err) {
60-
vfree(cq->queue->buf);
61-
kfree(cq->queue);
59+
if (err)
6260
return err;
63-
}
6461

6562
cq->is_user = uresp;
6663

0 commit comments

Comments
 (0)