tor-browser

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

find.c (11188B)


      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 * find.c
      7 *
      8 * This file implements the nssCKFWFindObjects type and methods.
      9 */
     10 
     11 #ifndef CK_H
     12 #include "ck.h"
     13 #endif /* CK_H */
     14 
     15 /*
     16 * NSSCKFWFindObjects
     17 *
     18 *  -- create/destroy --
     19 *  nssCKFWFindObjects_Create
     20 *  nssCKFWFindObjects_Destroy
     21 *
     22 *  -- public accessors --
     23 *  NSSCKFWFindObjects_GetMDFindObjects
     24 *
     25 *  -- implement public accessors --
     26 *  nssCKFWFindObjects_GetMDFindObjects
     27 *
     28 *  -- private accessors --
     29 *
     30 *  -- module fronts --
     31 *  nssCKFWFindObjects_Next
     32 */
     33 
     34 struct NSSCKFWFindObjectsStr {
     35    NSSCKFWMutex *mutex; /* merely to serialise the MDObject calls */
     36    NSSCKMDFindObjects *mdfo1;
     37    NSSCKMDFindObjects *mdfo2;
     38    NSSCKFWSession *fwSession;
     39    NSSCKMDSession *mdSession;
     40    NSSCKFWToken *fwToken;
     41    NSSCKMDToken *mdToken;
     42    NSSCKFWInstance *fwInstance;
     43    NSSCKMDInstance *mdInstance;
     44 
     45    NSSCKMDFindObjects *mdFindObjects; /* varies */
     46 };
     47 
     48 #ifdef DEBUG
     49 /*
     50 * But first, the pointer-tracking stuff.
     51 *
     52 * NOTE: the pointer-tracking support in NSS/base currently relies
     53 * upon NSPR's CallOnce support.  That, however, relies upon NSPR's
     54 * locking, which is tied into the runtime.  We need a pointer-tracker
     55 * implementation that uses the locks supplied through C_Initialize.
     56 * That support, however, can be filled in later.  So for now, I'll
     57 * just do these routines as no-ops.
     58 */
     59 
     60 static CK_RV
     61 findObjects_add_pointer(
     62    const NSSCKFWFindObjects *fwFindObjects)
     63 {
     64    return CKR_OK;
     65 }
     66 
     67 static CK_RV
     68 findObjects_remove_pointer(
     69    const NSSCKFWFindObjects *fwFindObjects)
     70 {
     71    return CKR_OK;
     72 }
     73 
     74 NSS_IMPLEMENT CK_RV
     75 nssCKFWFindObjects_verifyPointer(
     76    const NSSCKFWFindObjects *fwFindObjects)
     77 {
     78    return CKR_OK;
     79 }
     80 
     81 #endif /* DEBUG */
     82 
     83 /*
     84 * nssCKFWFindObjects_Create
     85 *
     86 */
     87 NSS_EXTERN NSSCKFWFindObjects *
     88 nssCKFWFindObjects_Create(
     89    NSSCKFWSession *fwSession,
     90    NSSCKFWToken *fwToken,
     91    NSSCKFWInstance *fwInstance,
     92    NSSCKMDFindObjects *mdFindObjects1,
     93    NSSCKMDFindObjects *mdFindObjects2,
     94    CK_RV *pError)
     95 {
     96    NSSCKFWFindObjects *fwFindObjects = NULL;
     97    NSSCKMDSession *mdSession;
     98    NSSCKMDToken *mdToken;
     99    NSSCKMDInstance *mdInstance;
    100 
    101    mdSession = nssCKFWSession_GetMDSession(fwSession);
    102    mdToken = nssCKFWToken_GetMDToken(fwToken);
    103    mdInstance = nssCKFWInstance_GetMDInstance(fwInstance);
    104 
    105    fwFindObjects = nss_ZNEW(NULL, NSSCKFWFindObjects);
    106    if (!fwFindObjects) {
    107        *pError = CKR_HOST_MEMORY;
    108        goto loser;
    109    }
    110 
    111    fwFindObjects->mdfo1 = mdFindObjects1;
    112    fwFindObjects->mdfo2 = mdFindObjects2;
    113    fwFindObjects->fwSession = fwSession;
    114    fwFindObjects->mdSession = mdSession;
    115    fwFindObjects->fwToken = fwToken;
    116    fwFindObjects->mdToken = mdToken;
    117    fwFindObjects->fwInstance = fwInstance;
    118    fwFindObjects->mdInstance = mdInstance;
    119 
    120    fwFindObjects->mutex = nssCKFWInstance_CreateMutex(fwInstance, NULL, pError);
    121    if (!fwFindObjects->mutex) {
    122        goto loser;
    123    }
    124 
    125 #ifdef DEBUG
    126    *pError = findObjects_add_pointer(fwFindObjects);
    127    if (CKR_OK != *pError) {
    128        goto loser;
    129    }
    130 #endif /* DEBUG */
    131 
    132    return fwFindObjects;
    133 
    134 loser:
    135    if (fwFindObjects) {
    136        if (NULL != mdFindObjects1) {
    137            if (NULL != mdFindObjects1->Final) {
    138                fwFindObjects->mdFindObjects = mdFindObjects1;
    139                mdFindObjects1->Final(mdFindObjects1, fwFindObjects, mdSession,
    140                                      fwSession, mdToken, fwToken, mdInstance, fwInstance);
    141            }
    142        }
    143 
    144        if (NULL != mdFindObjects2) {
    145            if (NULL != mdFindObjects2->Final) {
    146                fwFindObjects->mdFindObjects = mdFindObjects2;
    147                mdFindObjects2->Final(mdFindObjects2, fwFindObjects, mdSession,
    148                                      fwSession, mdToken, fwToken, mdInstance, fwInstance);
    149            }
    150        }
    151 
    152        nss_ZFreeIf(fwFindObjects);
    153    }
    154 
    155    if (CKR_OK == *pError) {
    156        *pError = CKR_GENERAL_ERROR;
    157    }
    158 
    159    return (NSSCKFWFindObjects *)NULL;
    160 }
    161 
    162 /*
    163 * nssCKFWFindObjects_Destroy
    164 *
    165 */
    166 NSS_EXTERN void
    167 nssCKFWFindObjects_Destroy(
    168    NSSCKFWFindObjects *fwFindObjects)
    169 {
    170 #ifdef NSSDEBUG
    171    if (CKR_OK != nssCKFWFindObjects_verifyPointer(fwFindObjects)) {
    172        return;
    173    }
    174 #endif /* NSSDEBUG */
    175 
    176    (void)nssCKFWMutex_Destroy(fwFindObjects->mutex);
    177 
    178    if (fwFindObjects->mdfo1) {
    179        if (fwFindObjects->mdfo1->Final) {
    180            fwFindObjects->mdFindObjects = fwFindObjects->mdfo1;
    181            fwFindObjects->mdfo1->Final(fwFindObjects->mdfo1, fwFindObjects,
    182                                        fwFindObjects->mdSession, fwFindObjects->fwSession,
    183                                        fwFindObjects->mdToken, fwFindObjects->fwToken,
    184                                        fwFindObjects->mdInstance, fwFindObjects->fwInstance);
    185        }
    186    }
    187 
    188    if (fwFindObjects->mdfo2) {
    189        if (fwFindObjects->mdfo2->Final) {
    190            fwFindObjects->mdFindObjects = fwFindObjects->mdfo2;
    191            fwFindObjects->mdfo2->Final(fwFindObjects->mdfo2, fwFindObjects,
    192                                        fwFindObjects->mdSession, fwFindObjects->fwSession,
    193                                        fwFindObjects->mdToken, fwFindObjects->fwToken,
    194                                        fwFindObjects->mdInstance, fwFindObjects->fwInstance);
    195        }
    196    }
    197 
    198    nss_ZFreeIf(fwFindObjects);
    199 
    200 #ifdef DEBUG
    201    (void)findObjects_remove_pointer(fwFindObjects);
    202 #endif /* DEBUG */
    203 
    204    return;
    205 }
    206 
    207 /*
    208 * nssCKFWFindObjects_GetMDFindObjects
    209 *
    210 */
    211 NSS_EXTERN NSSCKMDFindObjects *
    212 nssCKFWFindObjects_GetMDFindObjects(
    213    NSSCKFWFindObjects *fwFindObjects)
    214 {
    215 #ifdef NSSDEBUG
    216    if (CKR_OK != nssCKFWFindObjects_verifyPointer(fwFindObjects)) {
    217        return (NSSCKMDFindObjects *)NULL;
    218    }
    219 #endif /* NSSDEBUG */
    220 
    221    return fwFindObjects->mdFindObjects;
    222 }
    223 
    224 /*
    225 * nssCKFWFindObjects_Next
    226 *
    227 */
    228 NSS_EXTERN NSSCKFWObject *
    229 nssCKFWFindObjects_Next(
    230    NSSCKFWFindObjects *fwFindObjects,
    231    NSSArena *arenaOpt,
    232    CK_RV *pError)
    233 {
    234    NSSCKMDObject *mdObject;
    235    NSSCKFWObject *fwObject = (NSSCKFWObject *)NULL;
    236    NSSArena *objArena;
    237 
    238 #ifdef NSSDEBUG
    239    if (!pError) {
    240        return (NSSCKFWObject *)NULL;
    241    }
    242 
    243    *pError = nssCKFWFindObjects_verifyPointer(fwFindObjects);
    244    if (CKR_OK != *pError) {
    245        return (NSSCKFWObject *)NULL;
    246    }
    247 #endif /* NSSDEBUG */
    248 
    249    *pError = nssCKFWMutex_Lock(fwFindObjects->mutex);
    250    if (CKR_OK != *pError) {
    251        return (NSSCKFWObject *)NULL;
    252    }
    253 
    254    if (fwFindObjects->mdfo1) {
    255        if (fwFindObjects->mdfo1->Next) {
    256            fwFindObjects->mdFindObjects = fwFindObjects->mdfo1;
    257            mdObject = fwFindObjects->mdfo1->Next(fwFindObjects->mdfo1,
    258                                                  fwFindObjects, fwFindObjects->mdSession, fwFindObjects->fwSession,
    259                                                  fwFindObjects->mdToken, fwFindObjects->fwToken,
    260                                                  fwFindObjects->mdInstance, fwFindObjects->fwInstance,
    261                                                  arenaOpt, pError);
    262            if (!mdObject) {
    263                if (CKR_OK != *pError) {
    264                    goto done;
    265                }
    266 
    267                /* All done. */
    268                fwFindObjects->mdfo1->Final(fwFindObjects->mdfo1, fwFindObjects,
    269                                            fwFindObjects->mdSession, fwFindObjects->fwSession,
    270                                            fwFindObjects->mdToken, fwFindObjects->fwToken,
    271                                            fwFindObjects->mdInstance, fwFindObjects->fwInstance);
    272                fwFindObjects->mdfo1 = (NSSCKMDFindObjects *)NULL;
    273            } else {
    274                goto wrap;
    275            }
    276        }
    277    }
    278 
    279    if (fwFindObjects->mdfo2) {
    280        if (fwFindObjects->mdfo2->Next) {
    281            fwFindObjects->mdFindObjects = fwFindObjects->mdfo2;
    282            mdObject = fwFindObjects->mdfo2->Next(fwFindObjects->mdfo2,
    283                                                  fwFindObjects, fwFindObjects->mdSession, fwFindObjects->fwSession,
    284                                                  fwFindObjects->mdToken, fwFindObjects->fwToken,
    285                                                  fwFindObjects->mdInstance, fwFindObjects->fwInstance,
    286                                                  arenaOpt, pError);
    287            if (!mdObject) {
    288                if (CKR_OK != *pError) {
    289                    goto done;
    290                }
    291 
    292                /* All done. */
    293                fwFindObjects->mdfo2->Final(fwFindObjects->mdfo2, fwFindObjects,
    294                                            fwFindObjects->mdSession, fwFindObjects->fwSession,
    295                                            fwFindObjects->mdToken, fwFindObjects->fwToken,
    296                                            fwFindObjects->mdInstance, fwFindObjects->fwInstance);
    297                fwFindObjects->mdfo2 = (NSSCKMDFindObjects *)NULL;
    298            } else {
    299                goto wrap;
    300            }
    301        }
    302    }
    303 
    304    /* No more objects */
    305    *pError = CKR_OK;
    306    goto done;
    307 
    308 wrap:
    309    /*
    310     * This seems is less than ideal-- we should determine if it's a token
    311     * object or a session object, and use the appropriate arena.
    312     * But that duplicates logic in nssCKFWObject_IsTokenObject.
    313     * Also we should lookup the real session the object was created on
    314     * if the object was a session object... however this code is actually
    315     * correct because nssCKFWObject_Create will return a cached version of
    316     * the object from it's hash. This is necessary because 1) we don't want
    317     * to create an arena style leak (where our arena grows with every search),
    318     * and 2) we want the same object to always have the same ID. This means
    319     * the only case the nssCKFWObject_Create() will need the objArena and the
    320     * Session is in the case of token objects (session objects should already
    321     * exist in the cache from their initial creation). So this code is correct,
    322     * but it depends on nssCKFWObject_Create caching all objects.
    323     */
    324    objArena = nssCKFWToken_GetArena(fwFindObjects->fwToken, pError);
    325    if (!objArena) {
    326        if (CKR_OK == *pError) {
    327            *pError = CKR_HOST_MEMORY;
    328        }
    329        goto done;
    330    }
    331 
    332    fwObject = nssCKFWObject_Create(objArena, mdObject,
    333                                    NULL, fwFindObjects->fwToken,
    334                                    fwFindObjects->fwInstance, pError);
    335    if (!fwObject) {
    336        if (CKR_OK == *pError) {
    337            *pError = CKR_GENERAL_ERROR;
    338        }
    339    }
    340 
    341 done:
    342    (void)nssCKFWMutex_Unlock(fwFindObjects->mutex);
    343    return fwObject;
    344 }
    345 
    346 /*
    347 * NSSCKFWFindObjects_GetMDFindObjects
    348 *
    349 */
    350 
    351 NSS_EXTERN NSSCKMDFindObjects *
    352 NSSCKFWFindObjects_GetMDFindObjects(
    353    NSSCKFWFindObjects *fwFindObjects)
    354 {
    355 #ifdef DEBUG
    356    if (CKR_OK != nssCKFWFindObjects_verifyPointer(fwFindObjects)) {
    357        return (NSSCKMDFindObjects *)NULL;
    358    }
    359 #endif /* DEBUG */
    360 
    361    return nssCKFWFindObjects_GetMDFindObjects(fwFindObjects);
    362 }