svn commit: r363118 - in projects/nfs-over-tls/sys/rpc: . rpcsec_tls
Rick Macklem
rmacklem at FreeBSD.org
Sun Jul 12 04:26:20 UTC 2020
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);
More information about the svn-src-projects
mailing list