Skip to content

Commit e38b55e

Browse files
Maor Gottliebjgunthorpe
authored andcommitted
RDMA/core: Fix protection fault in ib_mr_pool_destroy
Fix NULL pointer dereference in the error flow of ib_create_qp_user when accessing to uninitialized list pointers - rdma_mrs and sig_mrs. The following crash from syzkaller revealed it. kasan: GPF could be caused by NULL-ptr deref or user memory access general protection fault: 0000 [#1] SMP KASAN PTI CPU: 1 PID: 23167 Comm: syz-executor.1 Not tainted 5.5.0-rc5 #2 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.12.1-0-ga5cab58e9a3f-prebuilt.qemu.org 04/01/2014 RIP: 0010:ib_mr_pool_destroy+0x81/0x1f0 Code: 00 00 fc ff df 49 c1 ec 03 4d 01 fc e8 a8 ea 72 fe 41 80 3c 24 00 0f 85 62 01 00 00 48 8b 13 48 89 d6 4c 8d 6a c8 48 c1 ee 03 <42> 80 3c 3e 00 0f 85 34 01 00 00 48 8d 7a 08 4c 8b 02 48 89 fe 48 RSP: 0018:ffffc9000951f8b0 EFLAGS: 00010046 RAX: 0000000000040000 RBX: ffff88810f268038 RCX: ffffffff82c41628 RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffffc9000951f850 RBP: ffff88810f268020 R08: 0000000000000004 R09: fffff520012a3f0a R10: 0000000000000001 R11: fffff520012a3f0a R12: ffffed1021e4d007 R13: ffffffffffffffc8 R14: 0000000000000246 R15: dffffc0000000000 FS: 00007f54bc788700(0000) GS:ffff88811b100000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000000000000 CR3: 0000000116920002 CR4: 0000000000360ee0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: rdma_rw_cleanup_mrs+0x15/0x30 ib_destroy_qp_user+0x674/0x7d0 ib_create_qp_user+0xb01/0x11c0 create_qp+0x1517/0x2130 ib_uverbs_create_qp+0x13e/0x190 ib_uverbs_write+0xaa5/0xdf0 __vfs_write+0x7c/0x100 vfs_write+0x168/0x4a0 ksys_write+0xc8/0x200 do_syscall_64+0x9c/0x390 entry_SYSCALL_64_after_hwframe+0x44/0xa9 RIP: 0033:0x465b49 Code: f7 d8 64 89 02 b8 ff ff ff ff c3 66 0f 1f 44 00 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 bc ff ff ff f7 d8 64 89 01 48 RSP: 002b:00007f54bc787c58 EFLAGS: 00000246 ORIG_RAX: 0000000000000001 RAX: ffffffffffffffda RBX: 000000000073bf00 RCX: 0000000000465b49 RDX: 0000000000000040 RSI: 0000000020000540 RDI: 0000000000000003 RBP: 00007f54bc787c70 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000246 R12: 00007f54bc7886bc R13: 00000000004ca2ec R14: 000000000070ded0 R15: 0000000000000005 Fixes: a060b56 ("IB/core: generic RDMA READ/WRITE API") Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Maor Gottlieb <[email protected]> Signed-off-by: Leon Romanovsky <[email protected]> Reviewed-by: Jason Gunthorpe <[email protected]> Signed-off-by: Jason Gunthorpe <[email protected]>
1 parent de5ed00 commit e38b55e

File tree

3 files changed

+14
-19
lines changed

3 files changed

+14
-19
lines changed

drivers/infiniband/core/core_priv.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,20 @@ static inline struct ib_qp *_ib_create_qp(struct ib_device *dev,
338338
qp->pd = pd;
339339
qp->uobject = uobj;
340340
qp->real_qp = qp;
341+
342+
qp->qp_type = attr->qp_type;
343+
qp->rwq_ind_tbl = attr->rwq_ind_tbl;
344+
qp->send_cq = attr->send_cq;
345+
qp->recv_cq = attr->recv_cq;
346+
qp->srq = attr->srq;
347+
qp->rwq_ind_tbl = attr->rwq_ind_tbl;
348+
qp->event_handler = attr->event_handler;
349+
350+
atomic_set(&qp->usecnt, 0);
351+
spin_lock_init(&qp->mr_lock);
352+
INIT_LIST_HEAD(&qp->rdma_mrs);
353+
INIT_LIST_HEAD(&qp->sig_mrs);
354+
341355
/*
342356
* We don't track XRC QPs for now, because they don't have PD
343357
* and more importantly they are created internaly by driver,

drivers/infiniband/core/uverbs_cmd.c

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1445,16 +1445,7 @@ static int create_qp(struct uverbs_attr_bundle *attrs,
14451445
if (ret)
14461446
goto err_cb;
14471447

1448-
qp->pd = pd;
1449-
qp->send_cq = attr.send_cq;
1450-
qp->recv_cq = attr.recv_cq;
1451-
qp->srq = attr.srq;
1452-
qp->rwq_ind_tbl = ind_tbl;
1453-
qp->event_handler = attr.event_handler;
1454-
qp->qp_type = attr.qp_type;
1455-
atomic_set(&qp->usecnt, 0);
14561448
atomic_inc(&pd->usecnt);
1457-
qp->port = 0;
14581449
if (attr.send_cq)
14591450
atomic_inc(&attr.send_cq->usecnt);
14601451
if (attr.recv_cq)

drivers/infiniband/core/verbs.c

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1185,16 +1185,6 @@ struct ib_qp *ib_create_qp_user(struct ib_pd *pd,
11851185
if (ret)
11861186
goto err;
11871187

1188-
qp->qp_type = qp_init_attr->qp_type;
1189-
qp->rwq_ind_tbl = qp_init_attr->rwq_ind_tbl;
1190-
1191-
atomic_set(&qp->usecnt, 0);
1192-
qp->mrs_used = 0;
1193-
spin_lock_init(&qp->mr_lock);
1194-
INIT_LIST_HEAD(&qp->rdma_mrs);
1195-
INIT_LIST_HEAD(&qp->sig_mrs);
1196-
qp->port = 0;
1197-
11981188
if (qp_init_attr->qp_type == IB_QPT_XRC_TGT) {
11991189
struct ib_qp *xrc_qp =
12001190
create_xrc_qp_user(qp, qp_init_attr, udata);

0 commit comments

Comments
 (0)