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)
This commit is contained in:
Rick Macklem 2009-07-01 16:42:03 +00:00
parent b766fabd9c
commit a4c5a1c315

View File

@ -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