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
nss_dbm_mdFindObjects_Final(NSSCKMDFindObjects * mdFindObjects,NSSCKFWFindObjects * fwFindObjects,NSSCKMDSession * mdSession,NSSCKFWSession * fwSession,NSSCKMDToken * mdToken,NSSCKFWToken * fwToken,NSSCKMDInstance * mdInstance,NSSCKFWInstance * fwInstance)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 *
nss_dbm_mdFindObjects_Next(NSSCKMDFindObjects * mdFindObjects,NSSCKFWFindObjects * fwFindObjects,NSSCKMDSession * mdSession,NSSCKFWSession * fwSession,NSSCKMDToken * mdToken,NSSCKFWToken * fwToken,NSSCKMDInstance * mdInstance,NSSCKFWInstance * fwInstance,NSSArena * arena,CK_RV * pError)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 *
nss_dbm_mdFindObjects_factory(nss_dbm_find_t * find,CK_RV * pError)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 }
127