diff --git a/libtirpc/src/auth_sspi.c b/libtirpc/src/auth_sspi.c index e53b37a..d618199 100644 --- a/libtirpc/src/auth_sspi.c +++ b/libtirpc/src/auth_sspi.c @@ -351,8 +351,19 @@ authsspi_refresh(AUTH *auth, void *tmp) gd = AUTH_PRIVATE(auth); - if (gd->established) + if (gd->established && tmp == NULL) return (TRUE); + else if (tmp) { + log_debug("trying to refresh credentials\n"); + DeleteSecurityContext(&gd->ctx); + sspi_release_buffer(&gd->gc.gc_ctx); + SecInvalidateHandle(&gd->ctx); + mem_free(gd->gc_wire_verf.value, gd->gc_wire_verf.length); + gd->gc_wire_verf.value = NULL; + gd->gc_wire_verf.length = 0; + gd->established = FALSE; + gd->gc.gc_proc = RPCSEC_SSPI_INIT; + } /* GSS context establishment loop. */ memset(&gr, 0, sizeof(gr)); diff --git a/libtirpc/src/clnt_vc.c b/libtirpc/src/clnt_vc.c index d0c0ea6..9ae30d6 100644 --- a/libtirpc/src/clnt_vc.c +++ b/libtirpc/src/clnt_vc.c @@ -159,9 +159,10 @@ static cond_t *vc_cv; #define acquire_fd_lock(fd) { \ mutex_lock(&clnt_fd_lock); \ - while (vc_fd_locks[WINSOCK_HANDLE_HASH(fd)]) \ + while (vc_fd_locks[WINSOCK_HANDLE_HASH(fd)] && \ + vc_fd_locks[WINSOCK_HANDLE_HASH(fd)] != GetCurrentThreadId()) \ cond_wait(&vc_cv[WINSOCK_HANDLE_HASH(fd)], &clnt_fd_lock); \ - vc_fd_locks[WINSOCK_HANDLE_HASH(fd)] = 1; \ + vc_fd_locks[WINSOCK_HANDLE_HASH(fd)] = GetCurrentThreadId(); \ mutex_unlock(&clnt_fd_lock); \ } @@ -554,10 +555,11 @@ call_again: while (TRUE) { mutex_lock(&clnt_fd_lock); - while (vc_fd_locks[WINSOCK_HANDLE_HASH(ct->ct_fd)] || + while ((vc_fd_locks[WINSOCK_HANDLE_HASH(ct->ct_fd)] && + vc_fd_locks[WINSOCK_HANDLE_HASH(ct->ct_fd)] != GetCurrentThreadId()) || (ct->reply_msg.rm_xid && ct->reply_msg.rm_xid != x_id)) cond_wait(&vc_cv[WINSOCK_HANDLE_HASH(ct->ct_fd)], &clnt_fd_lock); - vc_fd_locks[WINSOCK_HANDLE_HASH(ct->ct_fd)] = 1; + vc_fd_locks[WINSOCK_HANDLE_HASH(ct->ct_fd)] = GetCurrentThreadId(); mutex_unlock(&clnt_fd_lock); xdrs->x_op = XDR_DECODE;