Thu, 22 Jan 2015 13:21:57 +0100
Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6
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_mdSession_Close
9 (
10 NSSCKMDSession *mdSession,
11 NSSCKFWSession *fwSession,
12 NSSCKMDToken *mdToken,
13 NSSCKFWToken *fwToken,
14 NSSCKMDInstance *mdInstance,
15 NSSCKFWInstance *fwInstance
16 )
17 {
18 nss_dbm_session_t *session = (nss_dbm_session_t *)mdSession->etc;
20 struct nss_dbm_dbt_node *w;
22 /* Lock */
23 {
24 if( CKR_OK != NSSCKFWMutex_Lock(session->list_lock) ) {
25 return;
26 }
28 w = session->session_objects;
29 session->session_objects = (struct nss_dbm_dbt_node *)NULL; /* sanity */
31 (void)NSSCKFWMutex_Unlock(session->list_lock);
32 }
34 for( ; (struct nss_dbm_dbt_node *)NULL != w; w = w->next ) {
35 (void)nss_dbm_db_delete_object(w->dbt);
36 }
37 }
39 static CK_ULONG
40 nss_dbm_mdSession_GetDeviceError
41 (
42 NSSCKMDSession *mdSession,
43 NSSCKFWSession *fwSession,
44 NSSCKMDToken *mdToken,
45 NSSCKFWToken *fwToken,
46 NSSCKMDInstance *mdInstance,
47 NSSCKFWInstance *fwInstance
48 )
49 {
50 nss_dbm_session_t *session = (nss_dbm_session_t *)mdSession->etc;
51 return session->deviceError;
52 }
54 /* Login isn't needed */
55 /* Logout isn't needed */
56 /* InitPIN is irrelevant */
57 /* SetPIN is irrelevant */
58 /* GetOperationStateLen is irrelevant */
59 /* GetOperationState is irrelevant */
60 /* SetOperationState is irrelevant */
62 static NSSCKMDObject *
63 nss_dbm_mdSession_CreateObject
64 (
65 NSSCKMDSession *mdSession,
66 NSSCKFWSession *fwSession,
67 NSSCKMDToken *mdToken,
68 NSSCKFWToken *fwToken,
69 NSSCKMDInstance *mdInstance,
70 NSSCKFWInstance *fwInstance,
71 NSSArena *handyArenaPointer,
72 CK_ATTRIBUTE_PTR pTemplate,
73 CK_ULONG ulAttributeCount,
74 CK_RV *pError
75 )
76 {
77 nss_dbm_session_t *session = (nss_dbm_session_t *)mdSession->etc;
78 nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc;
79 CK_ULONG i;
80 CK_BBOOL isToken = CK_FALSE; /* defaults to false */
81 NSSCKMDObject *rv;
82 struct nss_dbm_dbt_node *node = (struct nss_dbm_dbt_node *)NULL;
83 nss_dbm_object_t *object;
84 nss_dbm_db_t *which_db;
86 /* This framework should really pass this to me */
87 for( i = 0; i < ulAttributeCount; i++ ) {
88 if( CKA_TOKEN == pTemplate[i].type ) {
89 isToken = *(CK_BBOOL *)pTemplate[i].pValue;
90 break;
91 }
92 }
94 object = nss_ZNEW(handyArenaPointer, nss_dbm_object_t);
95 if( (nss_dbm_object_t *)NULL == object ) {
96 *pError = CKR_HOST_MEMORY;
97 return (NSSCKMDObject *)NULL;
98 }
100 object->arena = handyArenaPointer;
101 which_db = isToken ? token->slot->token_db : token->session_db;
103 /* Do this before the actual database call; it's easier to recover from */
104 rv = nss_dbm_mdObject_factory(object, pError);
105 if( (NSSCKMDObject *)NULL == rv ) {
106 return (NSSCKMDObject *)NULL;
107 }
109 if( CK_FALSE == isToken ) {
110 node = nss_ZNEW(session->arena, struct nss_dbm_dbt_node);
111 if( (struct nss_dbm_dbt_node *)NULL == node ) {
112 *pError = CKR_HOST_MEMORY;
113 return (NSSCKMDObject *)NULL;
114 }
115 }
117 object->handle = nss_dbm_db_create_object(handyArenaPointer, which_db,
118 pTemplate, ulAttributeCount,
119 pError, &session->deviceError);
120 if( (nss_dbm_dbt_t *)NULL == object->handle ) {
121 return (NSSCKMDObject *)NULL;
122 }
124 if( CK_FALSE == isToken ) {
125 node->dbt = object->handle;
126 /* Lock */
127 {
128 *pError = NSSCKFWMutex_Lock(session->list_lock);
129 if( CKR_OK != *pError ) {
130 (void)nss_dbm_db_delete_object(object->handle);
131 return (NSSCKMDObject *)NULL;
132 }
134 node->next = session->session_objects;
135 session->session_objects = node;
137 *pError = NSSCKFWMutex_Unlock(session->list_lock);
138 }
139 }
141 return rv;
142 }
144 /* CopyObject isn't needed; the framework will use CreateObject */
146 static NSSCKMDFindObjects *
147 nss_dbm_mdSession_FindObjectsInit
148 (
149 NSSCKMDSession *mdSession,
150 NSSCKFWSession *fwSession,
151 NSSCKMDToken *mdToken,
152 NSSCKFWToken *fwToken,
153 NSSCKMDInstance *mdInstance,
154 NSSCKFWInstance *fwInstance,
155 CK_ATTRIBUTE_PTR pTemplate,
156 CK_ULONG ulAttributeCount,
157 CK_RV *pError
158 )
159 {
160 nss_dbm_session_t *session = (nss_dbm_session_t *)mdSession->etc;
161 nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc;
162 NSSArena *arena;
163 nss_dbm_find_t *find;
164 NSSCKMDFindObjects *rv;
166 arena = NSSArena_Create();
167 if( (NSSArena *)NULL == arena ) {
168 *pError = CKR_HOST_MEMORY;
169 goto loser;
170 }
172 find = nss_ZNEW(arena, nss_dbm_find_t);
173 if( (nss_dbm_find_t *)NULL == find ) {
174 *pError = CKR_HOST_MEMORY;
175 goto loser;
176 }
178 find->arena = arena;
179 find->list_lock = NSSCKFWInstance_CreateMutex(fwInstance, arena, pError);
180 if( (NSSCKFWMutex *)NULL == find->list_lock ) {
181 goto loser;
182 }
184 *pError = nss_dbm_db_find_objects(find, token->slot->token_db, pTemplate,
185 ulAttributeCount, &session->deviceError);
186 if( CKR_OK != *pError ) {
187 goto loser;
188 }
190 *pError = nss_dbm_db_find_objects(find, token->session_db, pTemplate,
191 ulAttributeCount, &session->deviceError);
192 if( CKR_OK != *pError ) {
193 goto loser;
194 }
196 rv = nss_dbm_mdFindObjects_factory(find, pError);
197 if( (NSSCKMDFindObjects *)NULL == rv ) {
198 goto loser;
199 }
201 return rv;
203 loser:
204 if( (NSSArena *)NULL != arena ) {
205 (void)NSSArena_Destroy(arena);
206 }
208 return (NSSCKMDFindObjects *)NULL;
209 }
211 /* SeedRandom is irrelevant */
212 /* GetRandom is irrelevant */
214 NSS_IMPLEMENT NSSCKMDSession *
215 nss_dbm_mdSession_factory
216 (
217 nss_dbm_token_t *token,
218 NSSCKFWSession *fwSession,
219 NSSCKFWInstance *fwInstance,
220 CK_BBOOL rw,
221 CK_RV *pError
222 )
223 {
224 NSSArena *arena;
225 nss_dbm_session_t *session;
226 NSSCKMDSession *rv;
228 arena = NSSCKFWSession_GetArena(fwSession, pError);
230 session = nss_ZNEW(arena, nss_dbm_session_t);
231 if( (nss_dbm_session_t *)NULL == session ) {
232 *pError = CKR_HOST_MEMORY;
233 return (NSSCKMDSession *)NULL;
234 }
236 rv = nss_ZNEW(arena, NSSCKMDSession);
237 if( (NSSCKMDSession *)NULL == rv ) {
238 *pError = CKR_HOST_MEMORY;
239 return (NSSCKMDSession *)NULL;
240 }
242 session->arena = arena;
243 session->token = token;
244 session->list_lock = NSSCKFWInstance_CreateMutex(fwInstance, arena, pError);
245 if( (NSSCKFWMutex *)NULL == session->list_lock ) {
246 return (NSSCKMDSession *)NULL;
247 }
249 rv->etc = (void *)session;
250 rv->Close = nss_dbm_mdSession_Close;
251 rv->GetDeviceError = nss_dbm_mdSession_GetDeviceError;
252 /* Login isn't needed */
253 /* Logout isn't needed */
254 /* InitPIN is irrelevant */
255 /* SetPIN is irrelevant */
256 /* GetOperationStateLen is irrelevant */
257 /* GetOperationState is irrelevant */
258 /* SetOperationState is irrelevant */
259 rv->CreateObject = nss_dbm_mdSession_CreateObject;
260 /* CopyObject isn't needed; the framework will use CreateObject */
261 rv->FindObjectsInit = nss_dbm_mdSession_FindObjectsInit;
262 rv->null = NULL;
264 return rv;
265 }