| OLD | NEW |
| 1 /* This Source Code Form is subject to the terms of the Mozilla Public | 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 | 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/. */ | 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
| 4 | 4 |
| 5 /* | 5 /* |
| 6 * find.c | 6 * find.c |
| 7 * | 7 * |
| 8 * This file implements the nssCKFWFindObjects type and methods. | 8 * This file implements the nssCKFWFindObjects type and methods. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 #ifndef CK_H | 11 #ifndef CK_H |
| 12 #include "ck.h" | 12 #include "ck.h" |
| 13 #endif /* CK_H */ | 13 #endif /* CK_H */ |
| 14 | 14 |
| 15 /* | 15 /* |
| 16 * NSSCKFWFindObjects | 16 * NSSCKFWFindObjects |
| 17 * | 17 * |
| 18 * -- create/destroy -- | 18 * -- create/destroy -- |
| 19 * nssCKFWFindObjects_Create | 19 * nssCKFWFindObjects_Create |
| 20 * nssCKFWFindObjects_Destroy | 20 * nssCKFWFindObjects_Destroy |
| 21 * | 21 * |
| 22 * -- public accessors -- | 22 * -- public accessors -- |
| 23 * NSSCKFWFindObjects_GetMDFindObjects | 23 * NSSCKFWFindObjects_GetMDFindObjects |
| 24 * | 24 * |
| 25 * -- implement public accessors -- | 25 * -- implement public accessors -- |
| 26 * nssCKFWFindObjects_GetMDFindObjects | 26 * nssCKFWFindObjects_GetMDFindObjects |
| 27 * | 27 * |
| 28 * -- private accessors -- | 28 * -- private accessors -- |
| 29 * | 29 * |
| 30 * -- module fronts -- | 30 * -- module fronts -- |
| 31 * nssCKFWFindObjects_Next | 31 * nssCKFWFindObjects_Next |
| 32 */ | 32 */ |
| 33 | 33 |
| 34 struct NSSCKFWFindObjectsStr { | 34 struct NSSCKFWFindObjectsStr { |
| 35 NSSCKFWMutex *mutex; /* merely to serialise the MDObject calls */ | 35 NSSCKFWMutex *mutex; /* merely to serialise the MDObject calls */ |
| 36 NSSCKMDFindObjects *mdfo1; | 36 NSSCKMDFindObjects *mdfo1; |
| 37 NSSCKMDFindObjects *mdfo2; | 37 NSSCKMDFindObjects *mdfo2; |
| 38 NSSCKFWSession *fwSession; | 38 NSSCKFWSession *fwSession; |
| 39 NSSCKMDSession *mdSession; | 39 NSSCKMDSession *mdSession; |
| 40 NSSCKFWToken *fwToken; | 40 NSSCKFWToken *fwToken; |
| 41 NSSCKMDToken *mdToken; | 41 NSSCKMDToken *mdToken; |
| 42 NSSCKFWInstance *fwInstance; | 42 NSSCKFWInstance *fwInstance; |
| 43 NSSCKMDInstance *mdInstance; | 43 NSSCKMDInstance *mdInstance; |
| 44 | 44 |
| 45 NSSCKMDFindObjects *mdFindObjects; /* varies */ | 45 NSSCKMDFindObjects *mdFindObjects; /* varies */ |
| 46 }; | 46 }; |
| 47 | 47 |
| 48 #ifdef DEBUG | 48 #ifdef DEBUG |
| 49 /* | 49 /* |
| 50 * But first, the pointer-tracking stuff. | 50 * But first, the pointer-tracking stuff. |
| 51 * | 51 * |
| 52 * NOTE: the pointer-tracking support in NSS/base currently relies | 52 * NOTE: the pointer-tracking support in NSS/base currently relies |
| 53 * upon NSPR's CallOnce support. That, however, relies upon NSPR's | 53 * upon NSPR's CallOnce support. That, however, relies upon NSPR's |
| 54 * locking, which is tied into the runtime. We need a pointer-tracker | 54 * locking, which is tied into the runtime. We need a pointer-tracker |
| 55 * implementation that uses the locks supplied through C_Initialize. | 55 * implementation that uses the locks supplied through C_Initialize. |
| 56 * That support, however, can be filled in later. So for now, I'll | 56 * That support, however, can be filled in later. So for now, I'll |
| 57 * just do these routines as no-ops. | 57 * just do these routines as no-ops. |
| 58 */ | 58 */ |
| 59 | 59 |
| 60 static CK_RV | 60 static CK_RV |
| 61 findObjects_add_pointer | 61 findObjects_add_pointer( |
| 62 ( | 62 const NSSCKFWFindObjects *fwFindObjects) |
| 63 const NSSCKFWFindObjects *fwFindObjects | |
| 64 ) | |
| 65 { | 63 { |
| 66 return CKR_OK; | 64 return CKR_OK; |
| 67 } | 65 } |
| 68 | 66 |
| 69 static CK_RV | 67 static CK_RV |
| 70 findObjects_remove_pointer | 68 findObjects_remove_pointer( |
| 71 ( | 69 const NSSCKFWFindObjects *fwFindObjects) |
| 72 const NSSCKFWFindObjects *fwFindObjects | |
| 73 ) | |
| 74 { | 70 { |
| 75 return CKR_OK; | 71 return CKR_OK; |
| 76 } | 72 } |
| 77 | 73 |
| 78 NSS_IMPLEMENT CK_RV | 74 NSS_IMPLEMENT CK_RV |
| 79 nssCKFWFindObjects_verifyPointer | 75 nssCKFWFindObjects_verifyPointer( |
| 80 ( | 76 const NSSCKFWFindObjects *fwFindObjects) |
| 81 const NSSCKFWFindObjects *fwFindObjects | |
| 82 ) | |
| 83 { | 77 { |
| 84 return CKR_OK; | 78 return CKR_OK; |
| 85 } | 79 } |
| 86 | 80 |
| 87 #endif /* DEBUG */ | 81 #endif /* DEBUG */ |
| 88 | 82 |
| 89 /* | 83 /* |
| 90 * nssCKFWFindObjects_Create | 84 * nssCKFWFindObjects_Create |
| 91 * | 85 * |
| 92 */ | 86 */ |
| 93 NSS_EXTERN NSSCKFWFindObjects * | 87 NSS_EXTERN NSSCKFWFindObjects * |
| 94 nssCKFWFindObjects_Create | 88 nssCKFWFindObjects_Create( |
| 95 ( | 89 NSSCKFWSession *fwSession, |
| 96 NSSCKFWSession *fwSession, | 90 NSSCKFWToken *fwToken, |
| 97 NSSCKFWToken *fwToken, | 91 NSSCKFWInstance *fwInstance, |
| 98 NSSCKFWInstance *fwInstance, | 92 NSSCKMDFindObjects *mdFindObjects1, |
| 99 NSSCKMDFindObjects *mdFindObjects1, | 93 NSSCKMDFindObjects *mdFindObjects2, |
| 100 NSSCKMDFindObjects *mdFindObjects2, | 94 CK_RV *pError) |
| 101 CK_RV *pError | |
| 102 ) | |
| 103 { | 95 { |
| 104 NSSCKFWFindObjects *fwFindObjects = NULL; | 96 NSSCKFWFindObjects *fwFindObjects = NULL; |
| 105 NSSCKMDSession *mdSession; | 97 NSSCKMDSession *mdSession; |
| 106 NSSCKMDToken *mdToken; | 98 NSSCKMDToken *mdToken; |
| 107 NSSCKMDInstance *mdInstance; | 99 NSSCKMDInstance *mdInstance; |
| 108 | 100 |
| 109 mdSession = nssCKFWSession_GetMDSession(fwSession); | 101 mdSession = nssCKFWSession_GetMDSession(fwSession); |
| 110 mdToken = nssCKFWToken_GetMDToken(fwToken); | 102 mdToken = nssCKFWToken_GetMDToken(fwToken); |
| 111 mdInstance = nssCKFWInstance_GetMDInstance(fwInstance); | 103 mdInstance = nssCKFWInstance_GetMDInstance(fwInstance); |
| 112 | 104 |
| 113 fwFindObjects = nss_ZNEW(NULL, NSSCKFWFindObjects); | 105 fwFindObjects = nss_ZNEW(NULL, NSSCKFWFindObjects); |
| 114 if (!fwFindObjects) { | 106 if (!fwFindObjects) { |
| 115 *pError = CKR_HOST_MEMORY; | 107 *pError = CKR_HOST_MEMORY; |
| 116 goto loser; | 108 goto loser; |
| 117 } | 109 } |
| 118 | 110 |
| 119 fwFindObjects->mdfo1 = mdFindObjects1; | 111 fwFindObjects->mdfo1 = mdFindObjects1; |
| 120 fwFindObjects->mdfo2 = mdFindObjects2; | 112 fwFindObjects->mdfo2 = mdFindObjects2; |
| 121 fwFindObjects->fwSession = fwSession; | 113 fwFindObjects->fwSession = fwSession; |
| 122 fwFindObjects->mdSession = mdSession; | 114 fwFindObjects->mdSession = mdSession; |
| 123 fwFindObjects->fwToken = fwToken; | 115 fwFindObjects->fwToken = fwToken; |
| 124 fwFindObjects->mdToken = mdToken; | 116 fwFindObjects->mdToken = mdToken; |
| 125 fwFindObjects->fwInstance = fwInstance; | 117 fwFindObjects->fwInstance = fwInstance; |
| 126 fwFindObjects->mdInstance = mdInstance; | 118 fwFindObjects->mdInstance = mdInstance; |
| 127 | 119 |
| 128 fwFindObjects->mutex = nssCKFWInstance_CreateMutex(fwInstance, NULL, pError); | 120 fwFindObjects->mutex = nssCKFWInstance_CreateMutex(fwInstance, NULL, pError)
; |
| 129 if (!fwFindObjects->mutex) { | 121 if (!fwFindObjects->mutex) { |
| 130 goto loser; | 122 goto loser; |
| 131 } | 123 } |
| 132 | 124 |
| 133 #ifdef DEBUG | 125 #ifdef DEBUG |
| 134 *pError = findObjects_add_pointer(fwFindObjects); | 126 *pError = findObjects_add_pointer(fwFindObjects); |
| 135 if( CKR_OK != *pError ) { | 127 if (CKR_OK != *pError) { |
| 136 goto loser; | 128 goto loser; |
| 137 } | 129 } |
| 138 #endif /* DEBUG */ | 130 #endif /* DEBUG */ |
| 139 | 131 |
| 140 return fwFindObjects; | 132 return fwFindObjects; |
| 141 | 133 |
| 142 loser: | 134 loser: |
| 143 if( fwFindObjects ) { | 135 if (fwFindObjects) { |
| 144 if( NULL != mdFindObjects1 ) { | 136 if (NULL != mdFindObjects1) { |
| 145 if( NULL != mdFindObjects1->Final ) { | 137 if (NULL != mdFindObjects1->Final) { |
| 146 fwFindObjects->mdFindObjects = mdFindObjects1; | 138 fwFindObjects->mdFindObjects = mdFindObjects1; |
| 147 mdFindObjects1->Final(mdFindObjects1, fwFindObjects, mdSession, | 139 mdFindObjects1->Final(mdFindObjects1, fwFindObjects, mdSession, |
| 148 fwSession, mdToken, fwToken, mdInstance, fwInstance); | 140 fwSession, mdToken, fwToken, mdInstance, f
wInstance); |
| 149 } | 141 } |
| 142 } |
| 143 |
| 144 if (NULL != mdFindObjects2) { |
| 145 if (NULL != mdFindObjects2->Final) { |
| 146 fwFindObjects->mdFindObjects = mdFindObjects2; |
| 147 mdFindObjects2->Final(mdFindObjects2, fwFindObjects, mdSession, |
| 148 fwSession, mdToken, fwToken, mdInstance, f
wInstance); |
| 149 } |
| 150 } |
| 151 |
| 152 nss_ZFreeIf(fwFindObjects); |
| 150 } | 153 } |
| 151 | 154 |
| 152 if( NULL != mdFindObjects2 ) { | 155 if (CKR_OK == *pError) { |
| 153 if( NULL != mdFindObjects2->Final ) { | 156 *pError = CKR_GENERAL_ERROR; |
| 154 fwFindObjects->mdFindObjects = mdFindObjects2; | |
| 155 mdFindObjects2->Final(mdFindObjects2, fwFindObjects, mdSession, | |
| 156 fwSession, mdToken, fwToken, mdInstance, fwInstance); | |
| 157 } | |
| 158 } | 157 } |
| 159 | 158 |
| 160 nss_ZFreeIf(fwFindObjects); | 159 return (NSSCKFWFindObjects *)NULL; |
| 161 } | |
| 162 | |
| 163 if( CKR_OK == *pError ) { | |
| 164 *pError = CKR_GENERAL_ERROR; | |
| 165 } | |
| 166 | |
| 167 return (NSSCKFWFindObjects *)NULL; | |
| 168 } | 160 } |
| 169 | 161 |
| 170 | |
| 171 /* | 162 /* |
| 172 * nssCKFWFindObjects_Destroy | 163 * nssCKFWFindObjects_Destroy |
| 173 * | 164 * |
| 174 */ | 165 */ |
| 175 NSS_EXTERN void | 166 NSS_EXTERN void |
| 176 nssCKFWFindObjects_Destroy | 167 nssCKFWFindObjects_Destroy( |
| 177 ( | 168 NSSCKFWFindObjects *fwFindObjects) |
| 178 NSSCKFWFindObjects *fwFindObjects | |
| 179 ) | |
| 180 { | 169 { |
| 181 #ifdef NSSDEBUG | 170 #ifdef NSSDEBUG |
| 182 if( CKR_OK != nssCKFWFindObjects_verifyPointer(fwFindObjects) ) { | 171 if (CKR_OK != nssCKFWFindObjects_verifyPointer(fwFindObjects)) { |
| 183 return; | 172 return; |
| 184 } | 173 } |
| 185 #endif /* NSSDEBUG */ | 174 #endif /* NSSDEBUG */ |
| 186 | 175 |
| 187 (void)nssCKFWMutex_Destroy(fwFindObjects->mutex); | 176 (void)nssCKFWMutex_Destroy(fwFindObjects->mutex); |
| 188 | 177 |
| 189 if (fwFindObjects->mdfo1) { | 178 if (fwFindObjects->mdfo1) { |
| 190 if (fwFindObjects->mdfo1->Final) { | 179 if (fwFindObjects->mdfo1->Final) { |
| 191 fwFindObjects->mdFindObjects = fwFindObjects->mdfo1; | 180 fwFindObjects->mdFindObjects = fwFindObjects->mdfo1; |
| 192 fwFindObjects->mdfo1->Final(fwFindObjects->mdfo1, fwFindObjects, | 181 fwFindObjects->mdfo1->Final(fwFindObjects->mdfo1, fwFindObjects, |
| 193 fwFindObjects->mdSession, fwFindObjects->fwSession, | 182 fwFindObjects->mdSession, fwFindObjects-
>fwSession, |
| 194 fwFindObjects->mdToken, fwFindObjects->fwToken, | 183 fwFindObjects->mdToken, fwFindObjects->f
wToken, |
| 195 fwFindObjects->mdInstance, fwFindObjects->fwInstance); | 184 fwFindObjects->mdInstance, fwFindObjects
->fwInstance); |
| 185 } |
| 196 } | 186 } |
| 197 } | |
| 198 | 187 |
| 199 if (fwFindObjects->mdfo2) { | 188 if (fwFindObjects->mdfo2) { |
| 200 if (fwFindObjects->mdfo2->Final) { | 189 if (fwFindObjects->mdfo2->Final) { |
| 201 fwFindObjects->mdFindObjects = fwFindObjects->mdfo2; | 190 fwFindObjects->mdFindObjects = fwFindObjects->mdfo2; |
| 202 fwFindObjects->mdfo2->Final(fwFindObjects->mdfo2, fwFindObjects, | 191 fwFindObjects->mdfo2->Final(fwFindObjects->mdfo2, fwFindObjects, |
| 203 fwFindObjects->mdSession, fwFindObjects->fwSession, | 192 fwFindObjects->mdSession, fwFindObjects-
>fwSession, |
| 204 fwFindObjects->mdToken, fwFindObjects->fwToken, | 193 fwFindObjects->mdToken, fwFindObjects->f
wToken, |
| 205 fwFindObjects->mdInstance, fwFindObjects->fwInstance); | 194 fwFindObjects->mdInstance, fwFindObjects
->fwInstance); |
| 195 } |
| 206 } | 196 } |
| 207 } | |
| 208 | 197 |
| 209 nss_ZFreeIf(fwFindObjects); | 198 nss_ZFreeIf(fwFindObjects); |
| 210 | 199 |
| 211 #ifdef DEBUG | 200 #ifdef DEBUG |
| 212 (void)findObjects_remove_pointer(fwFindObjects); | 201 (void)findObjects_remove_pointer(fwFindObjects); |
| 213 #endif /* DEBUG */ | 202 #endif /* DEBUG */ |
| 214 | 203 |
| 215 return; | 204 return; |
| 216 } | 205 } |
| 217 | 206 |
| 218 /* | 207 /* |
| 219 * nssCKFWFindObjects_GetMDFindObjects | 208 * nssCKFWFindObjects_GetMDFindObjects |
| 220 * | 209 * |
| 221 */ | 210 */ |
| 222 NSS_EXTERN NSSCKMDFindObjects * | 211 NSS_EXTERN NSSCKMDFindObjects * |
| 223 nssCKFWFindObjects_GetMDFindObjects | 212 nssCKFWFindObjects_GetMDFindObjects( |
| 224 ( | 213 NSSCKFWFindObjects *fwFindObjects) |
| 225 NSSCKFWFindObjects *fwFindObjects | |
| 226 ) | |
| 227 { | 214 { |
| 228 #ifdef NSSDEBUG | 215 #ifdef NSSDEBUG |
| 229 if( CKR_OK != nssCKFWFindObjects_verifyPointer(fwFindObjects) ) { | 216 if (CKR_OK != nssCKFWFindObjects_verifyPointer(fwFindObjects)) { |
| 230 return (NSSCKMDFindObjects *)NULL; | 217 return (NSSCKMDFindObjects *)NULL; |
| 231 } | 218 } |
| 232 #endif /* NSSDEBUG */ | 219 #endif /* NSSDEBUG */ |
| 233 | 220 |
| 234 return fwFindObjects->mdFindObjects; | 221 return fwFindObjects->mdFindObjects; |
| 235 } | 222 } |
| 236 | 223 |
| 237 /* | 224 /* |
| 238 * nssCKFWFindObjects_Next | 225 * nssCKFWFindObjects_Next |
| 239 * | 226 * |
| 240 */ | 227 */ |
| 241 NSS_EXTERN NSSCKFWObject * | 228 NSS_EXTERN NSSCKFWObject * |
| 242 nssCKFWFindObjects_Next | 229 nssCKFWFindObjects_Next( |
| 243 ( | 230 NSSCKFWFindObjects *fwFindObjects, |
| 244 NSSCKFWFindObjects *fwFindObjects, | 231 NSSArena *arenaOpt, |
| 245 NSSArena *arenaOpt, | 232 CK_RV *pError) |
| 246 CK_RV *pError | |
| 247 ) | |
| 248 { | 233 { |
| 249 NSSCKMDObject *mdObject; | 234 NSSCKMDObject *mdObject; |
| 250 NSSCKFWObject *fwObject = (NSSCKFWObject *)NULL; | 235 NSSCKFWObject *fwObject = (NSSCKFWObject *)NULL; |
| 251 NSSArena *objArena; | 236 NSSArena *objArena; |
| 252 | 237 |
| 253 #ifdef NSSDEBUG | 238 #ifdef NSSDEBUG |
| 254 if (!pError) { | 239 if (!pError) { |
| 255 return (NSSCKFWObject *)NULL; | 240 return (NSSCKFWObject *)NULL; |
| 256 } | 241 } |
| 257 | 242 |
| 258 *pError = nssCKFWFindObjects_verifyPointer(fwFindObjects); | 243 *pError = nssCKFWFindObjects_verifyPointer(fwFindObjects); |
| 259 if( CKR_OK != *pError ) { | 244 if (CKR_OK != *pError) { |
| 260 return (NSSCKFWObject *)NULL; | 245 return (NSSCKFWObject *)NULL; |
| 261 } | 246 } |
| 262 #endif /* NSSDEBUG */ | 247 #endif /* NSSDEBUG */ |
| 263 | 248 |
| 264 *pError = nssCKFWMutex_Lock(fwFindObjects->mutex); | 249 *pError = nssCKFWMutex_Lock(fwFindObjects->mutex); |
| 265 if( CKR_OK != *pError ) { | 250 if (CKR_OK != *pError) { |
| 266 return (NSSCKFWObject *)NULL; | 251 return (NSSCKFWObject *)NULL; |
| 267 } | 252 } |
| 268 | 253 |
| 269 if (fwFindObjects->mdfo1) { | 254 if (fwFindObjects->mdfo1) { |
| 270 if (fwFindObjects->mdfo1->Next) { | 255 if (fwFindObjects->mdfo1->Next) { |
| 271 fwFindObjects->mdFindObjects = fwFindObjects->mdfo1; | 256 fwFindObjects->mdFindObjects = fwFindObjects->mdfo1; |
| 272 mdObject = fwFindObjects->mdfo1->Next(fwFindObjects->mdfo1, | 257 mdObject = fwFindObjects->mdfo1->Next(fwFindObjects->mdfo1, |
| 273 fwFindObjects, fwFindObjects->mdSession, fwFindObjects->fwSession, | 258 fwFindObjects, fwFindObjects->
mdSession, fwFindObjects->fwSession, |
| 274 fwFindObjects->mdToken, fwFindObjects->fwToken, | 259 fwFindObjects->mdToken, fwFind
Objects->fwToken, |
| 275 fwFindObjects->mdInstance, fwFindObjects->fwInstance, | 260 fwFindObjects->mdInstance, fwF
indObjects->fwInstance, |
| 276 arenaOpt, pError); | 261 arenaOpt, pError); |
| 277 if (!mdObject) { | 262 if (!mdObject) { |
| 278 if( CKR_OK != *pError ) { | 263 if (CKR_OK != *pError) { |
| 279 goto done; | 264 goto done; |
| 265 } |
| 266 |
| 267 /* All done. */ |
| 268 fwFindObjects->mdfo1->Final(fwFindObjects->mdfo1, fwFindObjects, |
| 269 fwFindObjects->mdSession, fwFindObje
cts->fwSession, |
| 270 fwFindObjects->mdToken, fwFindObject
s->fwToken, |
| 271 fwFindObjects->mdInstance, fwFindObj
ects->fwInstance); |
| 272 fwFindObjects->mdfo1 = (NSSCKMDFindObjects *)NULL; |
| 273 } else { |
| 274 goto wrap; |
| 275 } |
| 280 } | 276 } |
| 277 } |
| 281 | 278 |
| 282 /* All done. */ | 279 if (fwFindObjects->mdfo2) { |
| 283 fwFindObjects->mdfo1->Final(fwFindObjects->mdfo1, fwFindObjects, | 280 if (fwFindObjects->mdfo2->Next) { |
| 284 fwFindObjects->mdSession, fwFindObjects->fwSession, | 281 fwFindObjects->mdFindObjects = fwFindObjects->mdfo2; |
| 285 fwFindObjects->mdToken, fwFindObjects->fwToken, | 282 mdObject = fwFindObjects->mdfo2->Next(fwFindObjects->mdfo2, |
| 286 fwFindObjects->mdInstance, fwFindObjects->fwInstance); | 283 fwFindObjects, fwFindObjects->
mdSession, fwFindObjects->fwSession, |
| 287 fwFindObjects->mdfo1 = (NSSCKMDFindObjects *)NULL; | 284 fwFindObjects->mdToken, fwFind
Objects->fwToken, |
| 288 } else { | 285 fwFindObjects->mdInstance, fwF
indObjects->fwInstance, |
| 289 goto wrap; | 286 arenaOpt, pError); |
| 290 } | 287 if (!mdObject) { |
| 288 if (CKR_OK != *pError) { |
| 289 goto done; |
| 290 } |
| 291 |
| 292 /* All done. */ |
| 293 fwFindObjects->mdfo2->Final(fwFindObjects->mdfo2, fwFindObjects, |
| 294 fwFindObjects->mdSession, fwFindObje
cts->fwSession, |
| 295 fwFindObjects->mdToken, fwFindObject
s->fwToken, |
| 296 fwFindObjects->mdInstance, fwFindObj
ects->fwInstance); |
| 297 fwFindObjects->mdfo2 = (NSSCKMDFindObjects *)NULL; |
| 298 } else { |
| 299 goto wrap; |
| 300 } |
| 301 } |
| 291 } | 302 } |
| 292 } | |
| 293 | 303 |
| 294 if (fwFindObjects->mdfo2) { | 304 /* No more objects */ |
| 295 if (fwFindObjects->mdfo2->Next) { | 305 *pError = CKR_OK; |
| 296 fwFindObjects->mdFindObjects = fwFindObjects->mdfo2; | 306 goto done; |
| 297 mdObject = fwFindObjects->mdfo2->Next(fwFindObjects->mdfo2, | |
| 298 fwFindObjects, fwFindObjects->mdSession, fwFindObjects->fwSession, | |
| 299 fwFindObjects->mdToken, fwFindObjects->fwToken, | |
| 300 fwFindObjects->mdInstance, fwFindObjects->fwInstance, | |
| 301 arenaOpt, pError); | |
| 302 if (!mdObject) { | |
| 303 if( CKR_OK != *pError ) { | |
| 304 goto done; | |
| 305 } | |
| 306 | 307 |
| 307 /* All done. */ | 308 wrap: |
| 308 fwFindObjects->mdfo2->Final(fwFindObjects->mdfo2, fwFindObjects, | 309 /* |
| 309 fwFindObjects->mdSession, fwFindObjects->fwSession, | |
| 310 fwFindObjects->mdToken, fwFindObjects->fwToken, | |
| 311 fwFindObjects->mdInstance, fwFindObjects->fwInstance); | |
| 312 fwFindObjects->mdfo2 = (NSSCKMDFindObjects *)NULL; | |
| 313 } else { | |
| 314 goto wrap; | |
| 315 } | |
| 316 } | |
| 317 } | |
| 318 | |
| 319 /* No more objects */ | |
| 320 *pError = CKR_OK; | |
| 321 goto done; | |
| 322 | |
| 323 wrap: | |
| 324 /* | |
| 325 * This seems is less than ideal-- we should determine if it's a token | 310 * This seems is less than ideal-- we should determine if it's a token |
| 326 * object or a session object, and use the appropriate arena. | 311 * object or a session object, and use the appropriate arena. |
| 327 * But that duplicates logic in nssCKFWObject_IsTokenObject. | 312 * But that duplicates logic in nssCKFWObject_IsTokenObject. |
| 328 * Also we should lookup the real session the object was created on | 313 * Also we should lookup the real session the object was created on |
| 329 * if the object was a session object... however this code is actually | 314 * if the object was a session object... however this code is actually |
| 330 * correct because nssCKFWObject_Create will return a cached version of | 315 * correct because nssCKFWObject_Create will return a cached version of |
| 331 * the object from it's hash. This is necessary because 1) we don't want | 316 * the object from it's hash. This is necessary because 1) we don't want |
| 332 * to create an arena style leak (where our arena grows with every search), | 317 * to create an arena style leak (where our arena grows with every search), |
| 333 * and 2) we want the same object to always have the same ID. This means | 318 * and 2) we want the same object to always have the same ID. This means |
| 334 * the only case the nssCKFWObject_Create() will need the objArena and the | 319 * the only case the nssCKFWObject_Create() will need the objArena and the |
| 335 * Session is in the case of token objects (session objects should already | 320 * Session is in the case of token objects (session objects should already |
| 336 * exist in the cache from their initial creation). So this code is correct, | 321 * exist in the cache from their initial creation). So this code is correct, |
| 337 * but it depends on nssCKFWObject_Create caching all objects. | 322 * but it depends on nssCKFWObject_Create caching all objects. |
| 338 */ | 323 */ |
| 339 objArena = nssCKFWToken_GetArena(fwFindObjects->fwToken, pError); | 324 objArena = nssCKFWToken_GetArena(fwFindObjects->fwToken, pError); |
| 340 if (!objArena) { | 325 if (!objArena) { |
| 341 if( CKR_OK == *pError ) { | 326 if (CKR_OK == *pError) { |
| 342 *pError = CKR_HOST_MEMORY; | 327 *pError = CKR_HOST_MEMORY; |
| 328 } |
| 329 goto done; |
| 343 } | 330 } |
| 344 goto done; | |
| 345 } | |
| 346 | 331 |
| 347 fwObject = nssCKFWObject_Create(objArena, mdObject, | 332 fwObject = nssCKFWObject_Create(objArena, mdObject, |
| 348 NULL, fwFindObjects->fwToken, | 333 NULL, fwFindObjects->fwToken, |
| 349 fwFindObjects->fwInstance, pError); | 334 fwFindObjects->fwInstance, pError); |
| 350 if (!fwObject) { | 335 if (!fwObject) { |
| 351 if( CKR_OK == *pError ) { | 336 if (CKR_OK == *pError) { |
| 352 *pError = CKR_GENERAL_ERROR; | 337 *pError = CKR_GENERAL_ERROR; |
| 338 } |
| 353 } | 339 } |
| 354 } | |
| 355 | 340 |
| 356 done: | 341 done: |
| 357 (void)nssCKFWMutex_Unlock(fwFindObjects->mutex); | 342 (void)nssCKFWMutex_Unlock(fwFindObjects->mutex); |
| 358 return fwObject; | 343 return fwObject; |
| 359 } | 344 } |
| 360 | 345 |
| 361 /* | 346 /* |
| 362 * NSSCKFWFindObjects_GetMDFindObjects | 347 * NSSCKFWFindObjects_GetMDFindObjects |
| 363 * | 348 * |
| 364 */ | 349 */ |
| 365 | 350 |
| 366 NSS_EXTERN NSSCKMDFindObjects * | 351 NSS_EXTERN NSSCKMDFindObjects * |
| 367 NSSCKFWFindObjects_GetMDFindObjects | 352 NSSCKFWFindObjects_GetMDFindObjects( |
| 368 ( | 353 NSSCKFWFindObjects *fwFindObjects) |
| 369 NSSCKFWFindObjects *fwFindObjects | |
| 370 ) | |
| 371 { | 354 { |
| 372 #ifdef DEBUG | 355 #ifdef DEBUG |
| 373 if( CKR_OK != nssCKFWFindObjects_verifyPointer(fwFindObjects) ) { | 356 if (CKR_OK != nssCKFWFindObjects_verifyPointer(fwFindObjects)) { |
| 374 return (NSSCKMDFindObjects *)NULL; | 357 return (NSSCKMDFindObjects *)NULL; |
| 375 } | 358 } |
| 376 #endif /* DEBUG */ | 359 #endif /* DEBUG */ |
| 377 | 360 |
| 378 return nssCKFWFindObjects_GetMDFindObjects(fwFindObjects); | 361 return nssCKFWFindObjects_GetMDFindObjects(fwFindObjects); |
| 379 } | 362 } |
| OLD | NEW |