Skip to content

Commit 967a72f

Browse files
committed
Merge tag 'v6.18-rc5-smb-server-fixes' of git://git.samba.org/ksmbd
Pull smb server fixes from Steve French: - Fix smbdirect (RDMA) disconnect hang bug - Fix potential Denial of Service when connection limit exceeded - Fix smbdirect (RDMA) connection (potentially accessing freed memory) bug * tag 'v6.18-rc5-smb-server-fixes' of git://git.samba.org/ksmbd: smb: server: let smb_direct_disconnect_rdma_connection() turn CREATED into DISCONNECTED ksmbd: close accepted socket when per-IP limit rejects connection smb: server: rdma: avoid unmapping posted recv on accept failure
2 parents 6fa9041 + 55286b1 commit 967a72f

2 files changed

Lines changed: 17 additions & 2 deletions

File tree

fs/smb/server/transport_rdma.c

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,9 @@ smb_direct_disconnect_rdma_connection(struct smbdirect_socket *sc)
334334
break;
335335

336336
case SMBDIRECT_SOCKET_CREATED:
337+
sc->status = SMBDIRECT_SOCKET_DISCONNECTED;
338+
break;
339+
337340
case SMBDIRECT_SOCKET_CONNECTED:
338341
sc->status = SMBDIRECT_SOCKET_ERROR;
339342
break;
@@ -1883,6 +1886,7 @@ static int smb_direct_accept_client(struct smbdirect_socket *sc)
18831886
static int smb_direct_prepare_negotiation(struct smbdirect_socket *sc)
18841887
{
18851888
struct smbdirect_recv_io *recvmsg;
1889+
bool recv_posted = false;
18861890
int ret;
18871891

18881892
WARN_ON_ONCE(sc->status != SMBDIRECT_SOCKET_CREATED);
@@ -1899,6 +1903,7 @@ static int smb_direct_prepare_negotiation(struct smbdirect_socket *sc)
18991903
pr_err("Can't post recv: %d\n", ret);
19001904
goto out_err;
19011905
}
1906+
recv_posted = true;
19021907

19031908
ret = smb_direct_accept_client(sc);
19041909
if (ret) {
@@ -1908,7 +1913,14 @@ static int smb_direct_prepare_negotiation(struct smbdirect_socket *sc)
19081913

19091914
return 0;
19101915
out_err:
1911-
put_recvmsg(sc, recvmsg);
1916+
/*
1917+
* If the recv was never posted, return it to the free list.
1918+
* If it was posted, leave it alone so disconnect teardown can
1919+
* drain the QP and complete it (flush) and the completion path
1920+
* will unmap it exactly once.
1921+
*/
1922+
if (!recv_posted)
1923+
put_recvmsg(sc, recvmsg);
19121924
return ret;
19131925
}
19141926

fs/smb/server/transport_tcp.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,8 +290,11 @@ static int ksmbd_kthread_fn(void *p)
290290
}
291291
}
292292
up_read(&conn_list_lock);
293-
if (ret == -EAGAIN)
293+
if (ret == -EAGAIN) {
294+
/* Per-IP limit hit: release the just-accepted socket. */
295+
sock_release(client_sk);
294296
continue;
297+
}
295298

296299
skip_max_ip_conns_limit:
297300
if (server_conf.max_connections &&

0 commit comments

Comments
 (0)