Skip to content

Commit a6c015b

Browse files
metze-sambasmfrench
authored andcommitted
smb: server: let recv_done() avoid touching data_transfer after cleanup/move
Calling enqueue_reassembly() and wake_up_interruptible(&t->wait_reassembly_queue) or put_receive_buffer() means the recvmsg/data_transfer pointer might get re-used by another thread, which means these should be the last operations before calling return. Cc: Namjae Jeon <[email protected]> Cc: Steve French <[email protected]> Cc: Tom Talpey <[email protected]> Cc: [email protected] Cc: [email protected] Fixes: 0626e66 ("cifsd: add server handler for central processing and tranport layers") Signed-off-by: Stefan Metzmacher <[email protected]> Acked-by: Namjae Jeon <[email protected]> Signed-off-by: Steve French <[email protected]>
1 parent cfe76fd commit a6c015b

File tree

1 file changed

+7
-5
lines changed

1 file changed

+7
-5
lines changed

fs/smb/server/transport_rdma.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -581,16 +581,11 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
581581
else
582582
t->full_packet_received = true;
583583

584-
enqueue_reassembly(t, recvmsg, (int)data_length);
585-
wake_up_interruptible(&t->wait_reassembly_queue);
586-
587584
spin_lock(&t->receive_credit_lock);
588585
receive_credits = --(t->recv_credits);
589586
avail_recvmsg_count = t->count_avail_recvmsg;
590587
spin_unlock(&t->receive_credit_lock);
591588
} else {
592-
put_recvmsg(t, recvmsg);
593-
594589
spin_lock(&t->receive_credit_lock);
595590
receive_credits = --(t->recv_credits);
596591
avail_recvmsg_count = ++(t->count_avail_recvmsg);
@@ -612,6 +607,13 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
612607
if (is_receive_credit_post_required(receive_credits, avail_recvmsg_count))
613608
mod_delayed_work(smb_direct_wq,
614609
&t->post_recv_credits_work, 0);
610+
611+
if (data_length) {
612+
enqueue_reassembly(t, recvmsg, (int)data_length);
613+
wake_up_interruptible(&t->wait_reassembly_queue);
614+
} else
615+
put_recvmsg(t, recvmsg);
616+
615617
return;
616618
}
617619
}

0 commit comments

Comments
 (0)