89 lines
2.6 KiB
Diff
89 lines
2.6 KiB
Diff
From 80250ddfb13b64a0fef53806669893094a731956 Mon Sep 17 00:00:00 2001
|
|
From: Namjae Jeon <linkinjeon@kernel.org>
|
|
Date: Sun, 17 Aug 2025 09:48:40 +0900
|
|
Subject: ksmbd: extend the connection limiting mechanism to support IPv6
|
|
|
|
Update the connection tracking logic to handle both IPv4 and IPv6
|
|
address families.
|
|
|
|
Cc: stable@vger.kernel.org
|
|
Fixes: e6bb91939740 ("ksmbd: limit repeated connections from clients with the same IP")
|
|
Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
|
|
Signed-off-by: Steve French <stfrench@microsoft.com>
|
|
---
|
|
fs/smb/server/connection.h | 7 ++++++-
|
|
fs/smb/server/transport_tcp.c | 26 +++++++++++++++++++++++---
|
|
2 files changed, 29 insertions(+), 4 deletions(-)
|
|
|
|
--- a/fs/smb/server/connection.h
|
|
+++ b/fs/smb/server/connection.h
|
|
@@ -46,7 +46,12 @@ struct ksmbd_conn {
|
|
struct mutex srv_mutex;
|
|
int status;
|
|
unsigned int cli_cap;
|
|
- __be32 inet_addr;
|
|
+ union {
|
|
+ __be32 inet_addr;
|
|
+#if IS_ENABLED(CONFIG_IPV6)
|
|
+ u8 inet6_addr[16];
|
|
+#endif
|
|
+ };
|
|
char *request_buf;
|
|
struct ksmbd_transport *transport;
|
|
struct nls_table *local_nls;
|
|
--- a/fs/smb/server/transport_tcp.c
|
|
+++ b/fs/smb/server/transport_tcp.c
|
|
@@ -87,7 +87,14 @@ static struct tcp_transport *alloc_trans
|
|
return NULL;
|
|
}
|
|
|
|
+#if IS_ENABLED(CONFIG_IPV6)
|
|
+ if (client_sk->sk->sk_family == AF_INET6)
|
|
+ memcpy(&conn->inet6_addr, &client_sk->sk->sk_v6_daddr, 16);
|
|
+ else
|
|
+ conn->inet_addr = inet_sk(client_sk->sk)->inet_daddr;
|
|
+#else
|
|
conn->inet_addr = inet_sk(client_sk->sk)->inet_daddr;
|
|
+#endif
|
|
conn->transport = KSMBD_TRANS(t);
|
|
KSMBD_TRANS(t)->conn = conn;
|
|
KSMBD_TRANS(t)->ops = &ksmbd_tcp_transport_ops;
|
|
@@ -231,7 +238,6 @@ static int ksmbd_kthread_fn(void *p)
|
|
{
|
|
struct socket *client_sk = NULL;
|
|
struct interface *iface = (struct interface *)p;
|
|
- struct inet_sock *csk_inet;
|
|
struct ksmbd_conn *conn;
|
|
int ret;
|
|
|
|
@@ -254,13 +260,27 @@ static int ksmbd_kthread_fn(void *p)
|
|
/*
|
|
* Limits repeated connections from clients with the same IP.
|
|
*/
|
|
- csk_inet = inet_sk(client_sk->sk);
|
|
down_read(&conn_list_lock);
|
|
list_for_each_entry(conn, &conn_list, conns_list)
|
|
- if (csk_inet->inet_daddr == conn->inet_addr) {
|
|
+#if IS_ENABLED(CONFIG_IPV6)
|
|
+ if (client_sk->sk->sk_family == AF_INET6) {
|
|
+ if (memcmp(&client_sk->sk->sk_v6_daddr,
|
|
+ &conn->inet6_addr, 16) == 0) {
|
|
+ ret = -EAGAIN;
|
|
+ break;
|
|
+ }
|
|
+ } else if (inet_sk(client_sk->sk)->inet_daddr ==
|
|
+ conn->inet_addr) {
|
|
ret = -EAGAIN;
|
|
break;
|
|
}
|
|
+#else
|
|
+ if (inet_sk(client_sk->sk)->inet_daddr ==
|
|
+ conn->inet_addr) {
|
|
+ ret = -EAGAIN;
|
|
+ break;
|
|
+ }
|
|
+#endif
|
|
up_read(&conn_list_lock);
|
|
if (ret == -EAGAIN)
|
|
continue;
|