Skip to content

Commit 21a4e47

Browse files
namjaejeonSteve French
authored andcommitted
ksmbd: fix use-after-free in __smb2_lease_break_noti()
Move tcp_transport free to ksmbd_conn_free. If ksmbd connection is referenced when ksmbd server thread terminates, It will not be freed, but conn->tcp_transport is freed. __smb2_lease_break_noti can be performed asynchronously when the connection is disconnected. __smb2_lease_break_noti calls ksmbd_conn_write, which can cause use-after-free when conn->ksmbd_transport is already freed. Cc: [email protected] Reported-by: Norbert Szetei <[email protected]> Tested-by: Norbert Szetei <[email protected]> Signed-off-by: Namjae Jeon <[email protected]> Signed-off-by: Steve French <[email protected]>
1 parent 1df0d4c commit 21a4e47

File tree

3 files changed

+13
-6
lines changed

3 files changed

+13
-6
lines changed

fs/smb/server/connection.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,10 @@ void ksmbd_conn_free(struct ksmbd_conn *conn)
3939
xa_destroy(&conn->sessions);
4040
kvfree(conn->request_buf);
4141
kfree(conn->preauth_info);
42-
if (atomic_dec_and_test(&conn->refcnt))
42+
if (atomic_dec_and_test(&conn->refcnt)) {
43+
ksmbd_free_transport(conn->transport);
4344
kfree(conn);
45+
}
4446
}
4547

4648
/**

fs/smb/server/transport_tcp.c

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -93,17 +93,21 @@ static struct tcp_transport *alloc_transport(struct socket *client_sk)
9393
return t;
9494
}
9595

96-
static void free_transport(struct tcp_transport *t)
96+
void ksmbd_free_transport(struct ksmbd_transport *kt)
9797
{
98-
kernel_sock_shutdown(t->sock, SHUT_RDWR);
99-
sock_release(t->sock);
100-
t->sock = NULL;
98+
struct tcp_transport *t = TCP_TRANS(kt);
10199

102-
ksmbd_conn_free(KSMBD_TRANS(t)->conn);
100+
sock_release(t->sock);
103101
kfree(t->iov);
104102
kfree(t);
105103
}
106104

105+
static void free_transport(struct tcp_transport *t)
106+
{
107+
kernel_sock_shutdown(t->sock, SHUT_RDWR);
108+
ksmbd_conn_free(KSMBD_TRANS(t)->conn);
109+
}
110+
107111
/**
108112
* kvec_array_init() - initialize a IO vector segment
109113
* @new: IO vector to be initialized

fs/smb/server/transport_tcp.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
int ksmbd_tcp_set_interfaces(char *ifc_list, int ifc_list_sz);
1010
struct interface *ksmbd_find_netdev_name_iface_list(char *netdev_name);
11+
void ksmbd_free_transport(struct ksmbd_transport *kt);
1112
int ksmbd_tcp_init(void);
1213
void ksmbd_tcp_destroy(void);
1314

0 commit comments

Comments
 (0)