Skip to content

Commit

Permalink
Bug 1508776 - Remove unneeded refcounting from SFTKSession r=mt,kjacobs
Browse files Browse the repository at this point in the history
SFTKSession objects are only ever actually destroyed at PK11 session closure,
as the session is always the final holder -- and asserting refCount == 1 shows
that to be true. Because of that, NSC_CloseSession can just call
`sftk_DestroySession` directly and leave `sftk_FreeSession` as a no-op to be
removed in the future.

Differential Revision: https://phabricator.services.mozilla.com/D47010

--HG--
extra : moz-landing-system : lando
  • Loading branch information
jcjones committed Sep 27, 2019
1 parent 9192d33 commit a168405
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 24 deletions.
10 changes: 5 additions & 5 deletions lib/softoken/pkcs11.c
Expand Up @@ -2805,8 +2805,9 @@ sftk_CloseAllSessions(SFTKSlot *slot, PRBool logout)
} else {
SKIP_AFTER_FORK(PZ_Unlock(lock));
}
if (session)
sftk_FreeSession(session);
if (session) {
sftk_DestroySession(session);
}
} while (session != NULL);
}
return CKR_OK;
Expand Down Expand Up @@ -4044,8 +4045,6 @@ NSC_CloseSession(CK_SESSION_HANDLE hSession)
if (sftkqueue_is_queued(session, hSession, slot->head, slot->sessHashSize)) {
sessionFound = PR_TRUE;
sftkqueue_delete(session, hSession, slot->head, slot->sessHashSize);
session->refCount--; /* can't go to zero while we hold the reference */
PORT_Assert(session->refCount > 0);
}
PZ_Unlock(lock);

Expand All @@ -4066,9 +4065,10 @@ NSC_CloseSession(CK_SESSION_HANDLE hSession)
if (session->info.flags & CKF_RW_SESSION) {
(void)PR_ATOMIC_DECREMENT(&slot->rwSessionCount);
}
sftk_DestroySession(session);
session = NULL;
}

sftk_FreeSession(session);
return CKR_OK;
}

Expand Down
2 changes: 1 addition & 1 deletion lib/softoken/pkcs11i.h
Expand Up @@ -285,7 +285,6 @@ struct SFTKSessionStr {
SFTKSession *next;
SFTKSession *prev;
CK_SESSION_HANDLE handle;
int refCount;
PZLock *objectLock;
int objectIDCount;
CK_SESSION_INFO info;
Expand Down Expand Up @@ -683,6 +682,7 @@ extern SFTKSlot *sftk_SlotFromSessionHandle(CK_SESSION_HANDLE handle);
extern CK_SLOT_ID sftk_SlotIDFromSessionHandle(CK_SESSION_HANDLE handle);
extern SFTKSession *sftk_SessionFromHandle(CK_SESSION_HANDLE handle);
extern void sftk_FreeSession(SFTKSession *session);
extern void sftk_DestroySession(SFTKSession *session);
extern SFTKSession *sftk_NewSession(CK_SLOT_ID slotID, CK_NOTIFY notify,
CK_VOID_PTR pApplication, CK_FLAGS flags);
extern void sftk_update_state(SFTKSlot *slot, SFTKSession *session);
Expand Down
23 changes: 5 additions & 18 deletions lib/softoken/pkcs11u.c
Expand Up @@ -1813,7 +1813,6 @@ sftk_NewSession(CK_SLOT_ID slotID, CK_NOTIFY notify, CK_VOID_PTR pApplication,
return NULL;

session->next = session->prev = NULL;
session->refCount = 1;
session->enc_context = NULL;
session->hash_context = NULL;
session->sign_context = NULL;
Expand All @@ -1837,11 +1836,10 @@ sftk_NewSession(CK_SLOT_ID slotID, CK_NOTIFY notify, CK_VOID_PTR pApplication,
}

/* free all the data associated with a session. */
static void
void
sftk_DestroySession(SFTKSession *session)
{
SFTKObjectList *op, *next;
PORT_Assert(session->refCount == 0);

/* clean out the attributes */
/* since no one is referencing us, it's safe to walk the chain
Expand Down Expand Up @@ -1885,31 +1883,20 @@ sftk_SessionFromHandle(CK_SESSION_HANDLE handle)

PZ_Lock(lock);
sftkqueue_find(session, handle, slot->head, slot->sessHashSize);
if (session)
session->refCount++;
PZ_Unlock(lock);

return (session);
}

/*
* release a reference to a session handle
* release a reference to a session handle. This method of using SFTKSessions
* is deprecated, but the pattern should be retained until a future effort
* to refactor all SFTKSession users at once is completed.
*/
void
sftk_FreeSession(SFTKSession *session)
{
PRBool destroy = PR_FALSE;
SFTKSlot *slot = sftk_SlotFromSession(session);
PZLock *lock = SFTK_SESSION_LOCK(slot, session->handle);

PZ_Lock(lock);
if (session->refCount == 1)
destroy = PR_TRUE;
session->refCount--;
PZ_Unlock(lock);

if (destroy)
sftk_DestroySession(session);
return;
}

void
Expand Down

0 comments on commit a168405

Please sign in to comment.