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