Commit ae0d7770 authored by Chuck Lever's avatar Chuck Lever
Browse files

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: default avatarChuck Lever <chuck.lever@oracle.com>
parent 0f516248
Loading
Loading
Loading
Loading
+18 −7
Original line number Diff line number Diff line
@@ -1293,27 +1293,38 @@ static struct svc_sock *svc_setup_socket(struct svc_serv *serv,
						struct socket *sock,
						int flags)
{
	struct file	*filp = NULL;
	struct svc_sock	*svsk;
	struct sock	*inet;
	int		pmap_register = !(flags & SVC_SOCK_ANONYMOUS);
	int		err = 0;

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

	if (!sock->file) {
		filp = sock_alloc_file(sock, O_NONBLOCK, NULL);
		if (IS_ERR(filp)) {
			kfree(svsk);
			return ERR_CAST(filp);
		}
	}

	inet = sock->sk;

	/* Register socket with portmapper */
	if (pmap_register)
	if (pmap_register) {
		int err;

		err = svc_register(serv, sock_net(sock->sk), inet->sk_family,
				     inet->sk_protocol,
				     ntohs(inet_sk(inet)->inet_sport));

		if (err < 0) {
			if (filp)
				fput(filp);
			kfree(svsk);
			return ERR_PTR(err);
		}
	}

	svsk->sk_sock = sock;
	svsk->sk_sk = inet;