svn commit: r195246 - head/sys/rpc/rpcsec_gss
Rick Macklem
rmacklem at FreeBSD.org
Wed Jul 1 16:42:04 UTC 2009
Author: rmacklem
Date: Wed Jul 1 16:42:03 2009
New Revision: 195246
URL: http://svn.freebsd.org/changeset/base/195246
Log:
When unmounting an NFS mount using sec=krb5[ip], the umount system
call could get hung sleeping on "gsssta" if the credentials for a user
that had been accessing the mount point have expired. This happened
because rpc_gss_destroy_context() would end up calling itself when the
"destroy context" RPC was attempted, trying to refresh the credentials.
This patch just checks for this case in rpc_gss_refresh() and returns
without attempting the refresh, which avoids the recursive call to
rpc_gss_destroy_context() and the subsequent hang.
Reviewed by: dfr
Approved by: re (Ken Smith), kib (mentor)
Modified:
head/sys/rpc/rpcsec_gss/rpcsec_gss.c
Modified: head/sys/rpc/rpcsec_gss/rpcsec_gss.c
==============================================================================
--- head/sys/rpc/rpcsec_gss/rpcsec_gss.c Wed Jul 1 16:38:18 2009 (r195245)
+++ head/sys/rpc/rpcsec_gss/rpcsec_gss.c Wed Jul 1 16:42:03 2009 (r195246)
@@ -929,6 +929,20 @@ rpc_gss_refresh(AUTH *auth, void *msg)
{
struct rpc_msg *reply = (struct rpc_msg *) msg;
rpc_gss_options_ret_t options;
+ struct rpc_gss_data *gd;
+
+ gd = AUTH_PRIVATE(auth);
+
+ /*
+ * If the context is in DESTROYING state, then just return, since
+ * there is no point in refreshing the credentials.
+ */
+ mtx_lock(&gd->gd_lock);
+ if (gd->gd_state == RPCSEC_GSS_DESTROYING) {
+ mtx_unlock(&gd->gd_lock);
+ return (FALSE);
+ }
+ mtx_unlock(&gd->gd_lock);
/*
* If the error was RPCSEC_GSS_CREDPROBLEM of
More information about the svn-src-all
mailing list