Skip to content

Commit ae0d777

Browse files
committed
SUNRPC: Ensure server-side sockets have a sock->file
The TLS handshake upcall mechanism requires a non-NULL sock->file on the socket it hands to user space. svc_sock_free() already releases sock->file properly if one exists. Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
1 parent 0f51624 commit ae0d777

1 file changed

Lines changed: 18 additions & 7 deletions

File tree

net/sunrpc/svcsock.c

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1293,26 +1293,37 @@ static struct svc_sock *svc_setup_socket(struct svc_serv *serv,
12931293
struct socket *sock,
12941294
int flags)
12951295
{
1296+
struct file *filp = NULL;
12961297
struct svc_sock *svsk;
12971298
struct sock *inet;
12981299
int pmap_register = !(flags & SVC_SOCK_ANONYMOUS);
1299-
int err = 0;
13001300

13011301
svsk = kzalloc(sizeof(*svsk), GFP_KERNEL);
13021302
if (!svsk)
13031303
return ERR_PTR(-ENOMEM);
13041304

1305+
if (!sock->file) {
1306+
filp = sock_alloc_file(sock, O_NONBLOCK, NULL);
1307+
if (IS_ERR(filp)) {
1308+
kfree(svsk);
1309+
return ERR_CAST(filp);
1310+
}
1311+
}
1312+
13051313
inet = sock->sk;
13061314

1307-
/* Register socket with portmapper */
1308-
if (pmap_register)
1315+
if (pmap_register) {
1316+
int err;
1317+
13091318
err = svc_register(serv, sock_net(sock->sk), inet->sk_family,
13101319
inet->sk_protocol,
13111320
ntohs(inet_sk(inet)->inet_sport));
1312-
1313-
if (err < 0) {
1314-
kfree(svsk);
1315-
return ERR_PTR(err);
1321+
if (err < 0) {
1322+
if (filp)
1323+
fput(filp);
1324+
kfree(svsk);
1325+
return ERR_PTR(err);
1326+
}
13161327
}
13171328

13181329
svsk->sk_sock = sock;

0 commit comments

Comments
 (0)