Skip to content

Commit 8c9ee2e

Browse files
namjaejeongregkh
authored andcommitted
ksmbd: extend the connection limiting mechanism to support IPv6
commit c0d4111 upstream. Update the connection tracking logic to handle both IPv4 and IPv6 address families. Cc: stable@vger.kernel.org Fixes: e6bb919 ("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> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 9a7abce commit 8c9ee2e

File tree

2 files changed

+29
-4
lines changed

2 files changed

+29
-4
lines changed

fs/smb/server/connection.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,12 @@ struct ksmbd_conn {
4646
struct mutex srv_mutex;
4747
int status;
4848
unsigned int cli_cap;
49-
__be32 inet_addr;
49+
union {
50+
__be32 inet_addr;
51+
#if IS_ENABLED(CONFIG_IPV6)
52+
u8 inet6_addr[16];
53+
#endif
54+
};
5055
char *request_buf;
5156
struct ksmbd_transport *transport;
5257
struct nls_table *local_nls;

fs/smb/server/transport_tcp.c

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,14 @@ static struct tcp_transport *alloc_transport(struct socket *client_sk)
8787
return NULL;
8888
}
8989

90+
#if IS_ENABLED(CONFIG_IPV6)
91+
if (client_sk->sk->sk_family == AF_INET6)
92+
memcpy(&conn->inet6_addr, &client_sk->sk->sk_v6_daddr, 16);
93+
else
94+
conn->inet_addr = inet_sk(client_sk->sk)->inet_daddr;
95+
#else
9096
conn->inet_addr = inet_sk(client_sk->sk)->inet_daddr;
97+
#endif
9198
conn->transport = KSMBD_TRANS(t);
9299
KSMBD_TRANS(t)->conn = conn;
93100
KSMBD_TRANS(t)->ops = &ksmbd_tcp_transport_ops;
@@ -231,7 +238,6 @@ static int ksmbd_kthread_fn(void *p)
231238
{
232239
struct socket *client_sk = NULL;
233240
struct interface *iface = (struct interface *)p;
234-
struct inet_sock *csk_inet;
235241
struct ksmbd_conn *conn;
236242
int ret;
237243

@@ -254,13 +260,27 @@ static int ksmbd_kthread_fn(void *p)
254260
/*
255261
* Limits repeated connections from clients with the same IP.
256262
*/
257-
csk_inet = inet_sk(client_sk->sk);
258263
down_read(&conn_list_lock);
259264
list_for_each_entry(conn, &conn_list, conns_list)
260-
if (csk_inet->inet_daddr == conn->inet_addr) {
265+
#if IS_ENABLED(CONFIG_IPV6)
266+
if (client_sk->sk->sk_family == AF_INET6) {
267+
if (memcmp(&client_sk->sk->sk_v6_daddr,
268+
&conn->inet6_addr, 16) == 0) {
269+
ret = -EAGAIN;
270+
break;
271+
}
272+
} else if (inet_sk(client_sk->sk)->inet_daddr ==
273+
conn->inet_addr) {
274+
ret = -EAGAIN;
275+
break;
276+
}
277+
#else
278+
if (inet_sk(client_sk->sk)->inet_daddr ==
279+
conn->inet_addr) {
261280
ret = -EAGAIN;
262281
break;
263282
}
283+
#endif
264284
up_read(&conn_list_lock);
265285
if (ret == -EAGAIN)
266286
continue;

0 commit comments

Comments
 (0)