diff --git a/dom/workers/WorkerPrivate.cpp b/dom/workers/WorkerPrivate.cpp index 27eb570e90..c6ef21f2cd 100644 --- a/dom/workers/WorkerPrivate.cpp +++ b/dom/workers/WorkerPrivate.cpp @@ -2543,6 +2543,12 @@ WorkerPrivateParent::DisableDebugger() WorkerPrivate* self = ParentAsWorkerPrivate(); + // RegisterDebugger might have been dispatched but not completed. + // Wait for its execution to complete before unregistering. + if (!NS_IsMainThread()) { + self->WaitForIsDebuggerRegistered(true); + } + if (NS_FAILED(UnregisterWorkerDebugger(self))) { NS_WARNING("Failed to unregister worker debugger!"); } diff --git a/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.h b/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.h index 1dcc70519a..6229e1c95b 100644 --- a/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.h +++ b/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.h @@ -530,7 +530,8 @@ public: void GetFingerprint(nsAString& fingerprint) { char *tmp; - GetFingerprint(&tmp); + nsresult rv = GetFingerprint(&tmp); + NS_ENSURE_SUCCESS_VOID(rv); fingerprint.AssignASCII(tmp); delete[] tmp; } diff --git a/security/nss/lib/softoken/pkcs11.c b/security/nss/lib/softoken/pkcs11.c index 8510064f37..ae2cdbd27e 100644 --- a/security/nss/lib/softoken/pkcs11.c +++ b/security/nss/lib/softoken/pkcs11.c @@ -2798,8 +2798,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; @@ -4034,8 +4035,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); @@ -4056,6 +4055,8 @@ 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); diff --git a/security/nss/lib/softoken/pkcs11i.h b/security/nss/lib/softoken/pkcs11i.h index ff062f0df0..7c7fb6953b 100644 --- a/security/nss/lib/softoken/pkcs11i.h +++ b/security/nss/lib/softoken/pkcs11i.h @@ -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); diff --git a/security/nss/lib/softoken/pkcs11u.c b/security/nss/lib/softoken/pkcs11u.c index dfed660a9f..1acc52e1c2 100644 --- a/security/nss/lib/softoken/pkcs11u.c +++ b/security/nss/lib/softoken/pkcs11u.c @@ -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