Skip to content

Commit 0c124aa

Browse files
committed
Merge branch 'net-smc-fixes-2020-10-14'
Karsten Graul says: ==================== net/smc: fixes 2020-10-14 The first patch fixes a possible use-after-free of delayed llc events. Patch 2 corrects the number of DMB buffer sizes. And patch 3 ensures a correctly formatted return code when smc_ism_register_dmb() fails to create a new DMB. ==================== Link: https://lore.kernel.org/r/20201014174329.35791-1-kgraul@linux.ibm.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2 parents 1d273fc + 6b1bbf9 commit 0c124aa

2 files changed

Lines changed: 8 additions & 10 deletions

File tree

net/smc/smc_core.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1597,7 +1597,7 @@ static int smcr_buf_map_usable_links(struct smc_link_group *lgr,
15971597
return rc;
15981598
}
15991599

1600-
#define SMCD_DMBE_SIZES 7 /* 0 -> 16KB, 1 -> 32KB, .. 6 -> 1MB */
1600+
#define SMCD_DMBE_SIZES 6 /* 0 -> 16KB, 1 -> 32KB, .. 6 -> 1MB */
16011601

16021602
static struct smc_buf_desc *smcd_new_buf_create(struct smc_link_group *lgr,
16031603
bool is_dmb, int bufsize)
@@ -1616,7 +1616,8 @@ static struct smc_buf_desc *smcd_new_buf_create(struct smc_link_group *lgr,
16161616
rc = smc_ism_register_dmb(lgr, bufsize, buf_desc);
16171617
if (rc) {
16181618
kfree(buf_desc);
1619-
return (rc == -ENOMEM) ? ERR_PTR(-EAGAIN) : ERR_PTR(rc);
1619+
return (rc == -ENOMEM) ? ERR_PTR(-EAGAIN) :
1620+
ERR_PTR(-EIO);
16201621
}
16211622
buf_desc->pages = virt_to_page(buf_desc->cpu_addr);
16221623
/* CDC header stored in buf. So, pretend it was smaller */

net/smc/smc_llc.c

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -233,8 +233,6 @@ static bool smc_llc_flow_start(struct smc_llc_flow *flow,
233233
default:
234234
flow->type = SMC_LLC_FLOW_NONE;
235235
}
236-
if (qentry == lgr->delayed_event)
237-
lgr->delayed_event = NULL;
238236
smc_llc_flow_qentry_set(flow, qentry);
239237
spin_unlock_bh(&lgr->llc_flow_lock);
240238
return true;
@@ -1603,13 +1601,12 @@ static void smc_llc_event_work(struct work_struct *work)
16031601
struct smc_llc_qentry *qentry;
16041602

16051603
if (!lgr->llc_flow_lcl.type && lgr->delayed_event) {
1606-
if (smc_link_usable(lgr->delayed_event->link)) {
1607-
smc_llc_event_handler(lgr->delayed_event);
1608-
} else {
1609-
qentry = lgr->delayed_event;
1610-
lgr->delayed_event = NULL;
1604+
qentry = lgr->delayed_event;
1605+
lgr->delayed_event = NULL;
1606+
if (smc_link_usable(qentry->link))
1607+
smc_llc_event_handler(qentry);
1608+
else
16111609
kfree(qentry);
1612-
}
16131610
}
16141611

16151612
again:

0 commit comments

Comments
 (0)