diff options
Diffstat (limited to 'ckcapi-object.c')
-rw-r--r-- | ckcapi-object.c | 73 |
1 files changed, 57 insertions, 16 deletions
diff --git a/ckcapi-object.c b/ckcapi-object.c index c02c365..c620cc4 100644 --- a/ckcapi-object.c +++ b/ckcapi-object.c @@ -17,6 +17,34 @@ object_free(CkCapiObject* obj) (obj->obj_funcs.release)(obj); } +void +ckcapi_object_clear_all(void) +{ + size_t i; + + ckcapi_lock_global(); + + if(object_hash) + { + ckcapi_hash_free(object_hash); + object_hash = NULL; + } + + if(object_array) + { + for(i = 0; i < object_array->len; ++i) + { + ASSERT(ckcapi_array_index(object_array, CkCapiObject*, i)); + object_free(ckcapi_array_index(object_array, CkCapiObject*, i)); + } + + ckcapi_array_free(object_array, TRUE); + object_array = NULL; + } + + ckcapi_unlock_global(); +} + CkCapiObject* ckcapi_object_lookup(CkCapiSession* sess, CK_OBJECT_HANDLE obj) { @@ -48,7 +76,7 @@ ckcapi_object_register(CkCapiSession* sess, CkCapiObject* obj) ASSERT(obj->unique_key); ASSERT(obj->unique_len); - DBGS(sess, "registering new session"); + DBGS(sess, "registering new object"); ckcapi_lock_global(); @@ -364,7 +392,7 @@ ckcapi_object_data_get_attrs(CkCapiObjectData* objdata, CK_ATTRIBUTE_PTR attrs, break; case DATA_ULONG: rv = (objdata->data_funcs.get_ulong)(objdata->data, attrs[i].type, - attrs[i].pValue, &attrs[i].ulValueLen); + attrs[i].pValue, &attrs[i].ulValueLen); break; case DATA_BYTES: rv = (objdata->data_funcs.get_bytes)(objdata->data, attrs[i].type, @@ -383,23 +411,36 @@ ckcapi_object_data_get_attrs(CkCapiObjectData* objdata, CK_ATTRIBUTE_PTR attrs, }; /* Not an error if they were just requesting the size */ - if(rv == CKR_BUFFER_TOO_SMALL) + if(rv != CKR_OK) { - if(!attrs[i].pValue) - rv = CKR_OK; - } + if(rv == CKR_BUFFER_TOO_SMALL) + { + if(!attrs[i].pValue) + rv = CKR_OK; + } - /* Is it a fatal error? */ - else if(rv != CKR_ATTRIBUTE_TYPE_INVALID) - { - ret = rv; - break; - } + /* Attribute is sensitive */ + else if(rv == CKR_ATTRIBUTE_SENSITIVE) + { + attrs[i].ulValueLen = (CK_ULONG)-1; + } - /* Transfer any non-fatal errors outward */ - if(rv != CKR_OK && ret == CKR_OK) - { - ret = rv; + /* Attribute doesn't exist */ + else if(rv == CKR_ATTRIBUTE_TYPE_INVALID) + { + attrs[i].ulValueLen = (CK_ULONG)-1; + } + + /* A fatal error? */ + else + { + ret = rv; + break; + } + + /* Transfer any non-fatal errors outward */ + if(rv != CKR_OK && ret == CKR_OK) + ret = rv; } } |