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