From: Kuniyuki Iwashima <kuniyu@xxxxxxxxxx> Date: Thu, 31 Oct 2024 10:57:09 -0700 > @@ -3071,7 +3070,7 @@ generic_ip_connect(struct TCP_Server_Info *server) > socket = server->ssocket; > } else { > rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM, > - IPPROTO_TCP, &server->ssocket, 1); > + IPPROTO_TCP, &server->ssocket, 0); I missed BPF inet_release() hook is invoked for sockets with sk->sk_kern_sock 0. This is trivial, but I'll post v2 with the diff below following the SMC's approach I took in commit 9744d2bf1976 ("smc: Fix use-after-free in tcp_write_timer_handler()."). ---8<--- diff --git a/fs/smb/client/connect.c b/fs/smb/client/connect.c index 15d94ac4095e..0ce2d704b1f3 100644 --- a/fs/smb/client/connect.c +++ b/fs/smb/client/connect.c @@ -1037,6 +1037,7 @@ clean_demultiplex_info(struct TCP_Server_Info *server) */ } + put_net(cifs_net_ns(server)); kfree(server->leaf_fullpath); kfree(server); @@ -1635,8 +1636,6 @@ cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect) /* srv_count can never go negative */ WARN_ON(server->srv_count < 0); - put_net(cifs_net_ns(server)); - list_del_init(&server->tcp_ses_list); spin_unlock(&cifs_tcp_ses_lock); @@ -3070,13 +3069,22 @@ generic_ip_connect(struct TCP_Server_Info *server) if (server->ssocket) { socket = server->ssocket; } else { - rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM, + struct net *net = cifs_net_ns(server); + struct sock *sk; + + rc = __sock_create(net, sfamily, SOCK_STREAM, IPPROTO_TCP, &server->ssocket, 1); if (rc < 0) { cifs_server_dbg(VFS, "Error %d creating socket\n", rc); return rc; } + sk = server->ssocket->sk; + __netns_tracker_free(net, &sk->ns_tracker, false); + sk->sk_net_refcnt = 1; + get_net_track(net, &sk->ns_tracker, GFP_KERNEL); + sock_inuse_add(net, 1); + /* BB other socket options to set KEEPALIVE, NODELAY? */ cifs_dbg(FYI, "Socket created\n"); socket = server->ssocket; ---8<---