| Index: src/tcs/tcs_auth_mgr.c
|
| diff --git a/src/tcs/tcs_auth_mgr.c b/src/tcs/tcs_auth_mgr.c
|
| index 577eaad556e6abee500d138326110745fc36af24..5d07832c0b534646b57371e473e2de8a22a2d520 100644
|
| --- a/src/tcs/tcs_auth_mgr.c
|
| +++ b/src/tcs/tcs_auth_mgr.c
|
| @@ -28,7 +28,6 @@
|
|
|
| MUTEX_DECLARE_EXTERN(tcsp_lock);
|
|
|
| -
|
| /* Note: The after taking the auth_mgr_lock in any of the functions below, the
|
| * mem_cache_lock cannot be taken without risking a deadlock. So, the auth_mgr
|
| * functions must be "self-contained" wrt locking */
|
| @@ -80,14 +79,13 @@ auth_mgr_final()
|
| TSS_RESULT
|
| auth_mgr_save_ctx(TCS_CONTEXT_HANDLE hContext)
|
| {
|
| - TSS_RESULT result;
|
| + TSS_RESULT result = TSS_SUCCESS;
|
| UINT32 i;
|
|
|
| for (i = 0; i < auth_mgr.auth_mapper_size; i++) {
|
| if (auth_mgr.auth_mapper[i].full == TRUE &&
|
| auth_mgr.auth_mapper[i].swap == NULL &&
|
| auth_mgr.auth_mapper[i].tcs_ctx != hContext) {
|
| -
|
| LogDebug("Calling TPM_SaveAuthContext for TCS CTX %x. Swapping out: TCS %x "
|
| "TPM %x", hContext, auth_mgr.auth_mapper[i].tcs_ctx,
|
| auth_mgr.auth_mapper[i].tpm_handle);
|
| @@ -98,12 +96,11 @@ auth_mgr_save_ctx(TCS_CONTEXT_HANDLE hContext)
|
| LogDebug("TPM_SaveAuthContext failed: 0x%x", result);
|
| return result;
|
| }
|
| -
|
| - /* XXX should there be a break here? */
|
| + break;
|
| }
|
| }
|
|
|
| - return TSS_SUCCESS;
|
| + return result;
|
| }
|
|
|
| /* if there's a TCS context waiting to get auth, wake it up or swap it in */
|
| @@ -111,7 +108,7 @@ void
|
| auth_mgr_swap_in()
|
| {
|
| if (auth_mgr.overflow[auth_mgr.of_tail] != NULL) {
|
| - LogDebug("waking up thread %zd, auth slot has opened", THREAD_ID);
|
| + LogDebug("waking up thread %lddd, auth slot has opened", THREAD_ID);
|
| /* wake up the next sleeping thread in order and increment tail */
|
| COND_SIGNAL(auth_mgr.overflow[auth_mgr.of_tail]);
|
| auth_mgr.overflow[auth_mgr.of_tail] = NULL;
|
| @@ -152,7 +149,7 @@ auth_mgr_swap_out(TCS_CONTEXT_HANDLE hContext)
|
| auth_mgr.overflow[auth_mgr.of_head] = cond;
|
| auth_mgr.of_head = (auth_mgr.of_head + 1) % auth_mgr.overflow_size;
|
| /* go to sleep */
|
| - LogDebug("thread %zd going to sleep until auth slot opens", THREAD_ID);
|
| + LogDebug("thread %lddd going to sleep until auth slot opens", THREAD_ID);
|
| auth_mgr.sleeping_threads++;
|
| COND_WAIT(cond, &tcsp_lock);
|
| auth_mgr.sleeping_threads--;
|
| @@ -183,7 +180,7 @@ auth_mgr_swap_out(TCS_CONTEXT_HANDLE hContext)
|
| auth_mgr.of_tail = 0;
|
| auth_mgr.overflow[auth_mgr.of_head] = cond;
|
| auth_mgr.of_head = (auth_mgr.of_head + 1) % auth_mgr.overflow_size;
|
| - LogDebug("thread %zd going to sleep until auth slot opens", THREAD_ID);
|
| + LogDebug("thread %lddd going to sleep until auth slot opens", THREAD_ID);
|
| auth_mgr.sleeping_threads++;
|
| COND_WAIT(cond, &tcsp_lock);
|
| auth_mgr.sleeping_threads--;
|
| @@ -218,8 +215,8 @@ auth_mgr_close_context(TCS_CONTEXT_HANDLE tcs_handle)
|
|
|
| /* Ok, probably dealing with a 1.1 TPM */
|
| if (result == TPM_E_BAD_ORDINAL)
|
| - result = internal_TerminateHandle(
|
| - auth_mgr.auth_mapper[i].tpm_handle);
|
| + result = internal_TerminateHandle(
|
| + auth_mgr.auth_mapper[i].tpm_handle);
|
|
|
| if (result == TCPA_E_INVALID_AUTHHANDLE) {
|
| LogDebug("Tried to close an invalid auth handle: %x",
|
| @@ -228,10 +225,14 @@ auth_mgr_close_context(TCS_CONTEXT_HANDLE tcs_handle)
|
| LogDebug("TPM_TerminateHandle returned %d", result);
|
| }
|
| }
|
| + /* clear the slot */
|
| auth_mgr.open_auth_sessions--;
|
| auth_mgr.auth_mapper[i].full = FALSE;
|
| + auth_mgr.auth_mapper[i].tpm_handle = 0;
|
| + auth_mgr.auth_mapper[i].tcs_ctx = 0;
|
| LogDebug("released auth for TCS %x TPM %x", tcs_handle,
|
| - auth_mgr.auth_mapper[i].tpm_handle);
|
| + auth_mgr.auth_mapper[i].tpm_handle);
|
| +
|
| auth_mgr_swap_in();
|
| }
|
| }
|
| @@ -264,14 +265,22 @@ auth_mgr_release_auth_handle(TCS_AUTHHANDLE tpm_auth_handle, TCS_CONTEXT_HANDLE
|
| auth_mgr.auth_mapper[i].tpm_handle == tpm_auth_handle &&
|
| auth_mgr.auth_mapper[i].tcs_ctx == tcs_handle) {
|
| if (!cont) {
|
| - /* Only termininate when not in use anymore */
|
| - result = TCSP_FlushSpecific_Common(auth_mgr.auth_mapper[i].tpm_handle,
|
| - TPM_RT_AUTH);
|
| + /*
|
| + * This function should not be necessary, but
|
| + * if the main operation resulted in an error,
|
| + * the TPM may still hold the auth handle
|
| + * and it must be freed. Most of the time
|
| + * this call will result in TPM_E_INVALID_AUTHHANDLE
|
| + * error which can be ignored.
|
| + */
|
| + result = TCSP_FlushSpecific_Common(
|
| + auth_mgr.auth_mapper[i].tpm_handle,
|
| + TPM_RT_AUTH);
|
|
|
| /* Ok, probably dealing with a 1.1 TPM */
|
| if (result == TPM_E_BAD_ORDINAL)
|
| - result = internal_TerminateHandle(
|
| - auth_mgr.auth_mapper[i].tpm_handle);
|
| + result = internal_TerminateHandle(
|
| + auth_mgr.auth_mapper[i].tpm_handle);
|
|
|
| if (result == TCPA_E_INVALID_AUTHHANDLE) {
|
| LogDebug("Tried to close an invalid auth handle: %x",
|
| @@ -279,12 +288,22 @@ auth_mgr_release_auth_handle(TCS_AUTHHANDLE tpm_auth_handle, TCS_CONTEXT_HANDLE
|
| } else if (result != TCPA_SUCCESS) {
|
| LogDebug("TPM_TerminateHandle returned %d", result);
|
| }
|
| +
|
| + if (result == TPM_SUCCESS) {
|
| + LogDebug("released auth for TCS %x TPM %x",
|
| + auth_mgr.auth_mapper[i].tcs_ctx, tpm_auth_handle);
|
| + }
|
| + /*
|
| + * Mark it as released, the "cont" flag indicates
|
| + * that it is no longer needed.
|
| + */
|
| + auth_mgr.open_auth_sessions--;
|
| + auth_mgr.auth_mapper[i].full = FALSE;
|
| + auth_mgr.auth_mapper[i].tpm_handle = 0;
|
| + auth_mgr.auth_mapper[i].tcs_ctx = 0;
|
| + auth_mgr_swap_in();
|
| }
|
| - auth_mgr.open_auth_sessions--;
|
| - auth_mgr.auth_mapper[i].full = FALSE;
|
| - LogDebug("released auth for TCS %x TPM %x",
|
| - auth_mgr.auth_mapper[i].tcs_ctx, tpm_auth_handle);
|
| - auth_mgr_swap_in();
|
| + /* If the cont flag is TRUE, we have to keep the handle */
|
| }
|
| }
|
|
|
| @@ -368,7 +387,7 @@ auth_mgr_add(TCS_CONTEXT_HANDLE tcsContext, TCS_AUTHHANDLE tpm_auth_handle)
|
| }
|
|
|
|
|
| - LogDebugFn("Thread %zd growing the auth table to %u entries", THREAD_ID,
|
| + LogDebugFn("Thread %ld growing the auth table to %u entries", THREAD_ID,
|
| auth_mgr.auth_mapper_size + TSS_DEFAULT_AUTH_TABLE_SIZE);
|
|
|
| auth_mgr.auth_mapper = calloc(auth_mgr.auth_mapper_size +
|
| @@ -563,4 +582,3 @@ TPM_LoadAuthContext(UINT32 size, BYTE *blob, TPM_AUTHHANDLE *handle)
|
|
|
| return result;
|
| }
|
| -
|
|
|