tor-browser

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

find.c (3484B)


      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 #include "ckdbm.h"
      6 
      7 static void
      8 nss_dbm_mdFindObjects_Final(
      9    NSSCKMDFindObjects *mdFindObjects,
     10    NSSCKFWFindObjects *fwFindObjects,
     11    NSSCKMDSession *mdSession,
     12    NSSCKFWSession *fwSession,
     13    NSSCKMDToken *mdToken,
     14    NSSCKFWToken *fwToken,
     15    NSSCKMDInstance *mdInstance,
     16    NSSCKFWInstance *fwInstance)
     17 {
     18    nss_dbm_find_t *find = (nss_dbm_find_t *)mdFindObjects->etc;
     19 
     20    /* Locks might have system resources associated */
     21    (void)NSSCKFWMutex_Destroy(find->list_lock);
     22    (void)NSSArena_Destroy(find->arena);
     23 }
     24 
     25 static NSSCKMDObject *
     26 nss_dbm_mdFindObjects_Next(
     27    NSSCKMDFindObjects *mdFindObjects,
     28    NSSCKFWFindObjects *fwFindObjects,
     29    NSSCKMDSession *mdSession,
     30    NSSCKFWSession *fwSession,
     31    NSSCKMDToken *mdToken,
     32    NSSCKFWToken *fwToken,
     33    NSSCKMDInstance *mdInstance,
     34    NSSCKFWInstance *fwInstance,
     35    NSSArena *arena,
     36    CK_RV *pError)
     37 {
     38    nss_dbm_find_t *find = (nss_dbm_find_t *)mdFindObjects->etc;
     39    struct nss_dbm_dbt_node *node;
     40    nss_dbm_object_t *object;
     41    NSSCKMDObject *rv;
     42 
     43    while (1) {
     44        /* Lock */
     45        {
     46            *pError = NSSCKFWMutex_Lock(find->list_lock);
     47            if (CKR_OK != *pError) {
     48                return (NSSCKMDObject *)NULL;
     49            }
     50 
     51            node = find->found;
     52            if ((struct nss_dbm_dbt_node *)NULL != node) {
     53                find->found = node->next;
     54            }
     55 
     56            *pError = NSSCKFWMutex_Unlock(find->list_lock);
     57            if (CKR_OK != *pError) {
     58                /* screwed now */
     59                return (NSSCKMDObject *)NULL;
     60            }
     61        }
     62 
     63        if ((struct nss_dbm_dbt_node *)NULL == node) {
     64            break;
     65        }
     66 
     67        if (nss_dbm_db_object_still_exists(node->dbt)) {
     68            break;
     69        }
     70    }
     71 
     72    if ((struct nss_dbm_dbt_node *)NULL == node) {
     73        *pError = CKR_OK;
     74        return (NSSCKMDObject *)NULL;
     75    }
     76 
     77    object = nss_ZNEW(arena, nss_dbm_object_t);
     78    if ((nss_dbm_object_t *)NULL == object) {
     79        *pError = CKR_HOST_MEMORY;
     80        return (NSSCKMDObject *)NULL;
     81    }
     82 
     83    object->arena = arena;
     84    object->handle = nss_ZNEW(arena, nss_dbm_dbt_t);
     85    if ((nss_dbm_dbt_t *)NULL == object->handle) {
     86        *pError = CKR_HOST_MEMORY;
     87        return (NSSCKMDObject *)NULL;
     88    }
     89 
     90    object->handle->my_db = node->dbt->my_db;
     91    object->handle->dbt.size = node->dbt->dbt.size;
     92    object->handle->dbt.data = nss_ZAlloc(arena, node->dbt->dbt.size);
     93    if ((void *)NULL == object->handle->dbt.data) {
     94        *pError = CKR_HOST_MEMORY;
     95        return (NSSCKMDObject *)NULL;
     96    }
     97 
     98    (void)memcpy(object->handle->dbt.data, node->dbt->dbt.data, node->dbt->dbt.size);
     99 
    100    rv = nss_dbm_mdObject_factory(object, pError);
    101    if ((NSSCKMDObject *)NULL == rv) {
    102        return (NSSCKMDObject *)NULL;
    103    }
    104 
    105    return rv;
    106 }
    107 
    108 NSS_IMPLEMENT NSSCKMDFindObjects *
    109 nss_dbm_mdFindObjects_factory(
    110    nss_dbm_find_t *find,
    111    CK_RV *pError)
    112 {
    113    NSSCKMDFindObjects *rv;
    114 
    115    rv = nss_ZNEW(find->arena, NSSCKMDFindObjects);
    116    if ((NSSCKMDFindObjects *)NULL == rv) {
    117        *pError = CKR_HOST_MEMORY;
    118        return (NSSCKMDFindObjects *)NULL;
    119    }
    120 
    121    rv->etc = (void *)find;
    122    rv->Final = nss_dbm_mdFindObjects_Final;
    123    rv->Next = nss_dbm_mdFindObjects_Next;
    124 
    125    return rv;
    126 }