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:
parent
b766fabd9c
commit
a4c5a1c315
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user