Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 12 Jul 2020 04:26:19 +0000 (UTC)
From:      Rick Macklem <rmacklem@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r363118 - in projects/nfs-over-tls/sys/rpc: . rpcsec_tls
Message-ID:  <202007120426.06C4QJf8025977@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rmacklem
Date: Sun Jul 12 04:26:19 2020
New Revision: 363118
URL: https://svnweb.freebsd.org/changeset/base/363118

Log:
  Hold a reference on the socket, so that it does not get free'd when the
  daemon closes it.
  
  This patch also adds a check for the sb_upcall being non-NULL.

Modified:
  projects/nfs-over-tls/sys/rpc/clnt_vc.c
  projects/nfs-over-tls/sys/rpc/rpcsec_tls/rpctls_impl.c
  projects/nfs-over-tls/sys/rpc/svc_vc.c

Modified: projects/nfs-over-tls/sys/rpc/clnt_vc.c
==============================================================================
--- projects/nfs-over-tls/sys/rpc/clnt_vc.c	Sun Jul 12 01:11:48 2020	(r363117)
+++ projects/nfs-over-tls/sys/rpc/clnt_vc.c	Sun Jul 12 04:26:19 2020	(r363118)
@@ -912,6 +912,11 @@ clnt_vc_destroy(CLIENT *cl)
 				    ct->ct_sslusec, ct->ct_sslrefno,
 				    &reterr);
 			}
+			/* Must sorele() to get rid of reference. */
+			CURVNET_SET(so->so_vnet);
+			SOCK_LOCK(so);
+			sorele(so);
+			CURVNET_RESTORE();
 		} else {
 			soshutdown(so, SHUT_WR);
 			soclose(so);

Modified: projects/nfs-over-tls/sys/rpc/rpcsec_tls/rpctls_impl.c
==============================================================================
--- projects/nfs-over-tls/sys/rpc/rpcsec_tls/rpctls_impl.c	Sun Jul 12 01:11:48 2020	(r363117)
+++ projects/nfs-over-tls/sys/rpc/rpcsec_tls/rpctls_impl.c	Sun Jul 12 04:26:19 2020	(r363118)
@@ -288,6 +288,7 @@ printf("falloc=%d fd=%d\n", error, fd);
 				 * not close the socket and will leave that for
 				 * the daemon to do.
 				 */
+				soref(so);
 				ssl[0] = ssl[1] = 0;
 				ssl[2] = RPCTLS_REFNO_HANDSHAKE;
 				CLNT_CONTROL(concl, CLSET_TLS, ssl);
@@ -317,6 +318,7 @@ printf("falloc=%d fd=%d\n", error, fd);
 				 * with the socket, it cannot be closed by
 				 * the server side krpc code (svc_vc.c).
 				 */
+				soref(so);
 				sx_xlock(&xprt->xp_lock);
 				xprt->xp_tls = RPCTLS_FLAGS_HANDSHFAIL;
 				sx_xunlock(&xprt->xp_lock);

Modified: projects/nfs-over-tls/sys/rpc/svc_vc.c
==============================================================================
--- projects/nfs-over-tls/sys/rpc/svc_vc.c	Sun Jul 12 01:11:48 2020	(r363117)
+++ projects/nfs-over-tls/sys/rpc/svc_vc.c	Sun Jul 12 04:26:19 2020	(r363118)
@@ -469,6 +469,14 @@ svc_vc_destroy_common(SVCXPRT *xprt)
 			    xprt->xp_sslusec, xprt->xp_sslrefno,
 			    &reterr);
 		}
+		if ((xprt->xp_tls & (RPCTLS_FLAGS_HANDSHAKE |
+		    RPCTLS_FLAGS_HANDSHFAIL)) != 0) {
+			/* Must sorele() to get rid of reference. */
+			CURVNET_SET(xprt->xp_socket->so_vnet);
+			SOCK_LOCK(xprt->xp_socket);
+			sorele(xprt->xp_socket);
+			CURVNET_RESTORE();
+		}
 	}
 
 	if (xprt->xp_netid)
@@ -498,7 +506,8 @@ svc_vc_destroy(SVCXPRT *xprt)
 	SOCKBUF_LOCK(&xprt->xp_socket->so_rcv);
 	if (xprt->xp_upcallset) {
 		xprt->xp_upcallset = 0;
-		soupcall_clear(xprt->xp_socket, SO_RCV);
+		if (xprt->xp_socket->so_rcv.sb_upcall != NULL)
+			soupcall_clear(xprt->xp_socket, SO_RCV);
 	}
 	SOCKBUF_UNLOCK(&xprt->xp_socket->so_rcv);
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202007120426.06C4QJf8025977>