mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-20 16:55:40 +00:00
Bug 1577822 - land NSS 5619cbbca3db UPGRADE_NSS_RELEASE, r=kjacobs
2019-09-27 J.C. Jones <jjones@mozilla.com> * lib/softoken/pkcs11.c, lib/softoken/pkcs11i.h, lib/softoken/pkcs11u.c: Bug 1508776 - Remove unneeded refcounting from SFTKSession r=mt,kjacobs 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. [5619cbbca3db] [tip] Differential Revision: https://phabricator.services.mozilla.com/D47631 --HG-- extra : moz-landing-system : lando
This commit is contained in:
parent
a20612a878
commit
af55efcd96
@ -1 +1 @@
|
||||
be9c48ad76cb
|
||||
5619cbbca3db
|
@ -10,3 +10,4 @@
|
||||
*/
|
||||
|
||||
#error "Do not include this header file."
|
||||
|
||||
|
@ -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;
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
@ -285,7 +285,6 @@ struct SFTKSessionStr {
|
||||
SFTKSession *next;
|
||||
SFTKSession *prev;
|
||||
CK_SESSION_HANDLE handle;
|
||||
int refCount;
|
||||
PZLock *objectLock;
|
||||
int objectIDCount;
|
||||
CK_SESSION_INFO info;
|
||||
@ -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);
|
||||
|
@ -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;
|
||||
@ -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
|
||||
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user