Skip to content

Commit ceb7d19

Browse files
committed
Merge: RDMA/rxe: Fix seg fault in rxe_comp_queue_pkt
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-9/-/merge_requests/4628 JIRA: https://issues.redhat.com/browse/RHEL-44248 CVE: CVE-2024-38544 commit 2b23b60 Author: Bob Pearson <rpearsonhpe@gmail.com> Date: Fri Mar 29 09:55:04 2024 -0500 RDMA/rxe: Fix seg fault in rxe_comp_queue_pkt In rxe_comp_queue_pkt() an incoming response packet skb is enqueued to the resp_pkts queue and then a decision is made whether to run the completer task inline or schedule it. Finally the skb is dereferenced to bump a 'hw' performance counter. This is wrong because if the completer task is already running in a separate thread it may have already processed the skb and freed it which can cause a seg fault. This has been observed infrequently in testing at high scale. This patch fixes this by changing the order of enqueuing the packet until after the counter is accessed. Link: https://lore.kernel.org/r/20240329145513.35381-4-rpearsonhpe@gmail.com Signed-off-by: Bob Pearson <rpearsonhpe@gmail.com> Fixes: 0b1e5b9 ("IB/rxe: Add port protocol stats") Signed-off-by: Jason Gunthorpe <jgg@nvidia.com> Signed-off-by: Kamal Heib <kheib@redhat.com> Approved-by: José Ignacio Tornos Martínez <jtornosm@redhat.com> Approved-by: John B. Wyatt IV <jwyatt@redhat.com> Approved-by: CKI KWF Bot <cki-ci-bot+kwf-gitlab-com@redhat.com> Merged-by: Lucas Zampieri <lzampier@redhat.com>
2 parents d03f4a6 + cb2416a commit ceb7d19

File tree

1 file changed

+3
-3
lines changed

1 file changed

+3
-3
lines changed

drivers/infiniband/sw/rxe/rxe_comp.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,12 +131,12 @@ void rxe_comp_queue_pkt(struct rxe_qp *qp, struct sk_buff *skb)
131131
{
132132
int must_sched;
133133

134-
skb_queue_tail(&qp->resp_pkts, skb);
135-
136-
must_sched = skb_queue_len(&qp->resp_pkts) > 1;
134+
must_sched = skb_queue_len(&qp->resp_pkts) > 0;
137135
if (must_sched != 0)
138136
rxe_counter_inc(SKB_TO_PKT(skb)->rxe, RXE_CNT_COMPLETER_SCHED);
139137

138+
skb_queue_tail(&qp->resp_pkts, skb);
139+
140140
if (must_sched)
141141
rxe_sched_task(&qp->comp.task);
142142
else

0 commit comments

Comments
 (0)