tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

mutex.c (4567B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 /*
      6 * mutex.c
      7 *
      8 * This file implements a mutual-exclusion locking facility for Modules
      9 * using the NSS Cryptoki Framework.
     10 */
     11 
     12 #ifndef CK_T
     13 #include "ck.h"
     14 #endif /* CK_T */
     15 
     16 /*
     17 * NSSCKFWMutex
     18 *
     19 *  NSSCKFWMutex_Destroy
     20 *  NSSCKFWMutex_Lock
     21 *  NSSCKFWMutex_Unlock
     22 *
     23 *  nssCKFWMutex_Create
     24 *  nssCKFWMutex_Destroy
     25 *  nssCKFWMutex_Lock
     26 *  nssCKFWMutex_Unlock
     27 *
     28 *  -- debugging versions only --
     29 *  nssCKFWMutex_verifyPointer
     30 *
     31 */
     32 
     33 struct NSSCKFWMutexStr {
     34    PRLock *lock;
     35 };
     36 
     37 #ifdef DEBUG
     38 /*
     39 * But first, the pointer-tracking stuff.
     40 *
     41 * NOTE: the pointer-tracking support in NSS/base currently relies
     42 * upon NSPR's CallOnce support.  That, however, relies upon NSPR's
     43 * locking, which is tied into the runtime.  We need a pointer-tracker
     44 * implementation that uses the locks supplied through C_Initialize.
     45 * That support, however, can be filled in later.  So for now, I'll
     46 * just do this routines as no-ops.
     47 */
     48 
     49 static CK_RV
     50 mutex_add_pointer(
     51    const NSSCKFWMutex *fwMutex)
     52 {
     53    return CKR_OK;
     54 }
     55 
     56 static CK_RV
     57 mutex_remove_pointer(
     58    const NSSCKFWMutex *fwMutex)
     59 {
     60    return CKR_OK;
     61 }
     62 
     63 NSS_IMPLEMENT CK_RV
     64 nssCKFWMutex_verifyPointer(
     65    const NSSCKFWMutex *fwMutex)
     66 {
     67    return CKR_OK;
     68 }
     69 
     70 #endif /* DEBUG */
     71 
     72 /*
     73 * nssCKFWMutex_Create
     74 *
     75 */
     76 NSS_EXTERN NSSCKFWMutex *
     77 nssCKFWMutex_Create(
     78    CK_C_INITIALIZE_ARGS_PTR pInitArgs,
     79    CryptokiLockingState LockingState,
     80    NSSArena *arena,
     81    CK_RV *pError)
     82 {
     83    NSSCKFWMutex *mutex;
     84 
     85    mutex = nss_ZNEW(arena, NSSCKFWMutex);
     86    if (!mutex) {
     87        *pError = CKR_HOST_MEMORY;
     88        return (NSSCKFWMutex *)NULL;
     89    }
     90    *pError = CKR_OK;
     91    mutex->lock = NULL;
     92    if (LockingState == MultiThreaded) {
     93        mutex->lock = PR_NewLock();
     94        if (!mutex->lock) {
     95            *pError = CKR_HOST_MEMORY; /* we couldn't get the resource */
     96        }
     97    }
     98 
     99    if (CKR_OK != *pError) {
    100        (void)nss_ZFreeIf(mutex);
    101        return (NSSCKFWMutex *)NULL;
    102    }
    103 
    104 #ifdef DEBUG
    105    *pError = mutex_add_pointer(mutex);
    106    if (CKR_OK != *pError) {
    107        if (mutex->lock) {
    108            PR_DestroyLock(mutex->lock);
    109        }
    110        (void)nss_ZFreeIf(mutex);
    111        return (NSSCKFWMutex *)NULL;
    112    }
    113 #endif /* DEBUG */
    114 
    115    return mutex;
    116 }
    117 
    118 /*
    119 * nssCKFWMutex_Destroy
    120 *
    121 */
    122 NSS_EXTERN CK_RV
    123 nssCKFWMutex_Destroy(
    124    NSSCKFWMutex *mutex)
    125 {
    126    CK_RV rv = CKR_OK;
    127 
    128 #ifdef NSSDEBUG
    129    rv = nssCKFWMutex_verifyPointer(mutex);
    130    if (CKR_OK != rv) {
    131        return rv;
    132    }
    133 #endif /* NSSDEBUG */
    134 
    135    if (mutex->lock) {
    136        PR_DestroyLock(mutex->lock);
    137    }
    138 
    139 #ifdef DEBUG
    140    (void)mutex_remove_pointer(mutex);
    141 #endif /* DEBUG */
    142 
    143    (void)nss_ZFreeIf(mutex);
    144    return rv;
    145 }
    146 
    147 /*
    148 * nssCKFWMutex_Lock
    149 *
    150 */
    151 NSS_EXTERN CK_RV
    152 nssCKFWMutex_Lock(
    153    NSSCKFWMutex *mutex)
    154 {
    155 #ifdef NSSDEBUG
    156    CK_RV rv = nssCKFWMutex_verifyPointer(mutex);
    157    if (CKR_OK != rv) {
    158        return rv;
    159    }
    160 #endif /* NSSDEBUG */
    161    if (mutex->lock) {
    162        PR_Lock(mutex->lock);
    163    }
    164 
    165    return CKR_OK;
    166 }
    167 
    168 /*
    169 * nssCKFWMutex_Unlock
    170 *
    171 */
    172 NSS_EXTERN CK_RV
    173 nssCKFWMutex_Unlock(
    174    NSSCKFWMutex *mutex)
    175 {
    176    PRStatus nrv;
    177 #ifdef NSSDEBUG
    178    CK_RV rv = nssCKFWMutex_verifyPointer(mutex);
    179 
    180    if (CKR_OK != rv) {
    181        return rv;
    182    }
    183 #endif /* NSSDEBUG */
    184 
    185    if (!mutex->lock)
    186        return CKR_OK;
    187 
    188    nrv = PR_Unlock(mutex->lock);
    189 
    190    /* if unlock fails, either we have a programming error, or we have
    191     * some sort of hardware failure... in either case return CKR_DEVICE_ERROR.
    192     */
    193    return nrv == PR_SUCCESS ? CKR_OK : CKR_DEVICE_ERROR;
    194 }
    195 
    196 /*
    197 * NSSCKFWMutex_Destroy
    198 *
    199 */
    200 NSS_EXTERN CK_RV
    201 NSSCKFWMutex_Destroy(
    202    NSSCKFWMutex *mutex)
    203 {
    204 #ifdef DEBUG
    205    CK_RV rv = nssCKFWMutex_verifyPointer(mutex);
    206    if (CKR_OK != rv) {
    207        return rv;
    208    }
    209 #endif /* DEBUG */
    210 
    211    return nssCKFWMutex_Destroy(mutex);
    212 }
    213 
    214 /*
    215 * NSSCKFWMutex_Lock
    216 *
    217 */
    218 NSS_EXTERN CK_RV
    219 NSSCKFWMutex_Lock(
    220    NSSCKFWMutex *mutex)
    221 {
    222 #ifdef DEBUG
    223    CK_RV rv = nssCKFWMutex_verifyPointer(mutex);
    224    if (CKR_OK != rv) {
    225        return rv;
    226    }
    227 #endif /* DEBUG */
    228 
    229    return nssCKFWMutex_Lock(mutex);
    230 }
    231 
    232 /*
    233 * NSSCKFWMutex_Unlock
    234 *
    235 */
    236 NSS_EXTERN CK_RV
    237 NSSCKFWMutex_Unlock(
    238    NSSCKFWMutex *mutex)
    239 {
    240 #ifdef DEBUG
    241    CK_RV rv = nssCKFWMutex_verifyPointer(mutex);
    242    if (CKR_OK != rv) {
    243        return rv;
    244    }
    245 #endif /* DEBUG */
    246 
    247    return nssCKFWMutex_Unlock(mutex);
    248 }