added check for NULL pointers and uninitialized pkcs11 lib
git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@916 c6295689-39f2-0310-b995-f0e70906c6a9
This commit is contained in:
parent
57954682fd
commit
958658102d
|
@ -66,8 +66,14 @@ out: debug(context, "C_Initialize: result = %d\n", rv);
|
|||
CK_RV C_Finalize(CK_VOID_PTR pReserved)
|
||||
{
|
||||
int i;
|
||||
CK_RV rv;
|
||||
|
||||
sc_pkcs11_lock();
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
|
||||
if (pReserved != NULL)
|
||||
return CKR_ARGUMENTS_BAD;
|
||||
|
||||
debug(context, "Shutting down Cryptoki\n");
|
||||
for (i=0; i<context->reader_count; i++)
|
||||
|
@ -83,7 +89,14 @@ CK_RV C_Finalize(CK_VOID_PTR pReserved)
|
|||
|
||||
CK_RV C_GetInfo(CK_INFO_PTR pInfo)
|
||||
{
|
||||
sc_pkcs11_lock();
|
||||
CK_RV rv;
|
||||
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
|
||||
if (pInfo == NULL_PTR)
|
||||
return CKR_ARGUMENTS_BAD;
|
||||
|
||||
debug(context, "Cryptoki info query\n");
|
||||
|
||||
|
@ -105,6 +118,9 @@ CK_RV C_GetInfo(CK_INFO_PTR pInfo)
|
|||
|
||||
CK_RV C_GetFunctionList(CK_FUNCTION_LIST_PTR_PTR ppFunctionList)
|
||||
{
|
||||
if (ppFunctionList == NULL_PTR)
|
||||
return CKR_ARGUMENTS_BAD;
|
||||
|
||||
*ppFunctionList = &pkcs11_function_list;
|
||||
return CKR_OK;
|
||||
}
|
||||
|
@ -118,7 +134,12 @@ CK_RV C_GetSlotList(CK_BBOOL tokenPresent, /* only slots with token prese
|
|||
sc_pkcs11_slot_t *slot;
|
||||
CK_RV rv;
|
||||
|
||||
sc_pkcs11_lock();
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
|
||||
if (pulCount == NULL_PTR)
|
||||
return CKR_ARGUMENTS_BAD;
|
||||
|
||||
debug(context, "Getting slot listing\n");
|
||||
card_detect_all();
|
||||
|
@ -160,7 +181,12 @@ CK_RV C_GetSlotInfo(CK_SLOT_ID slotID, CK_SLOT_INFO_PTR pInfo)
|
|||
struct sc_pkcs11_slot *slot;
|
||||
CK_RV rv;
|
||||
|
||||
sc_pkcs11_lock();
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
|
||||
if (pInfo == NULL_PTR)
|
||||
return CKR_ARGUMENTS_BAD;
|
||||
|
||||
debug(context, "Getting info about slot %d\n", slotID);
|
||||
|
||||
|
@ -182,7 +208,12 @@ CK_RV C_GetTokenInfo(CK_SLOT_ID slotID, CK_TOKEN_INFO_PTR pInfo)
|
|||
struct sc_pkcs11_slot *slot;
|
||||
CK_RV rv;
|
||||
|
||||
sc_pkcs11_lock();
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
|
||||
if (pInfo == NULL_PTR)
|
||||
return CKR_ARGUMENTS_BAD;
|
||||
|
||||
debug(context, "Getting info about token in slot %d\n", slotID);
|
||||
|
||||
|
@ -201,7 +232,9 @@ CK_RV C_GetMechanismList(CK_SLOT_ID slotID,
|
|||
struct sc_pkcs11_slot *slot;
|
||||
CK_RV rv;
|
||||
|
||||
sc_pkcs11_lock();
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
|
||||
rv = slot_get_token(slotID, &slot);
|
||||
if (rv == CKR_OK)
|
||||
|
@ -218,7 +251,12 @@ CK_RV C_GetMechanismInfo(CK_SLOT_ID slotID,
|
|||
struct sc_pkcs11_slot *slot;
|
||||
CK_RV rv;
|
||||
|
||||
sc_pkcs11_lock();
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
|
||||
if (pInfo == NULL_PTR)
|
||||
return CKR_ARGUMENTS_BAD;
|
||||
|
||||
rv = slot_get_token(slotID, &slot);
|
||||
if (rv == CKR_OK)
|
||||
|
@ -238,7 +276,9 @@ CK_RV C_InitToken(CK_SLOT_ID slotID,
|
|||
struct sc_pkcs11_slot *slot;
|
||||
CK_RV rv;
|
||||
|
||||
sc_pkcs11_lock();
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
|
||||
rv = slot_get_token(slotID, &slot);
|
||||
if (rv != CKR_OK)
|
||||
|
@ -277,7 +317,9 @@ CK_RV C_WaitForSlotEvent(CK_FLAGS flags, /* blocking/nonblocking flag */
|
|||
unsigned int mask, events;
|
||||
CK_RV rv;
|
||||
|
||||
sc_pkcs11_lock();
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
|
||||
mask = SC_EVENT_CARD_INSERTED|SC_EVENT_CARD_REMOVED;
|
||||
|
||||
|
@ -366,17 +408,22 @@ sc_pkcs11_free_lock()
|
|||
_lock = NULL;
|
||||
}
|
||||
|
||||
void
|
||||
CK_RV
|
||||
sc_pkcs11_lock()
|
||||
{
|
||||
if (context == NULL)
|
||||
return CKR_CRYPTOKI_NOT_INITIALIZED;
|
||||
|
||||
if (!_lock)
|
||||
return;
|
||||
return CKR_OK;
|
||||
if (_locking) {
|
||||
while (_locking->LockMutex(_lock) != CKR_OK)
|
||||
;
|
||||
} else {
|
||||
sc_mutex_lock((sc_mutex_t *) _lock);
|
||||
}
|
||||
|
||||
return CKR_OK;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -37,7 +37,9 @@ CK_RV C_CreateObject(CK_SESSION_HANDLE hSession, /* the session's handle */
|
|||
struct sc_pkcs11_card *card;
|
||||
int rv;
|
||||
|
||||
sc_pkcs11_lock();
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
dump_template("C_CreateObject()", pTemplate, ulCount);
|
||||
|
||||
rv = pool_find(&session_pool, hSession, (void**) &session);
|
||||
|
@ -94,7 +96,9 @@ CK_RV C_GetAttributeValue(CK_SESSION_HANDLE hSession, /* the session's handle
|
|||
struct sc_pkcs11_object *object;
|
||||
int res, res_type;
|
||||
|
||||
sc_pkcs11_lock();
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
|
||||
rv = pool_find(&session_pool, hSession, (void**) &session);
|
||||
if (rv != CKR_OK)
|
||||
|
@ -144,7 +148,9 @@ CK_RV C_SetAttributeValue(CK_SESSION_HANDLE hSession, /* the session's handle
|
|||
struct sc_pkcs11_session *session;
|
||||
struct sc_pkcs11_object *object;
|
||||
|
||||
sc_pkcs11_lock();
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
|
||||
rv = pool_find(&session_pool, hSession, (void**) &session);
|
||||
if (rv != CKR_OK)
|
||||
|
@ -181,7 +187,9 @@ CK_RV C_FindObjectsInit(CK_SESSION_HANDLE hSession, /* the session's handle */
|
|||
struct sc_pkcs11_find_operation *operation;
|
||||
struct sc_pkcs11_pool_item *item;
|
||||
|
||||
sc_pkcs11_lock();
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
|
||||
rv = pool_find(&session_pool, hSession, (void**) &session);
|
||||
if (rv != CKR_OK)
|
||||
|
@ -260,7 +268,9 @@ CK_RV C_FindObjects(CK_SESSION_HANDLE hSession, /* the session's han
|
|||
struct sc_pkcs11_session *session;
|
||||
struct sc_pkcs11_find_operation *operation;
|
||||
|
||||
sc_pkcs11_lock();
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
|
||||
rv = pool_find(&session_pool, hSession, (void**) &session);
|
||||
if (rv != CKR_OK)
|
||||
|
@ -292,7 +302,9 @@ CK_RV C_FindObjectsFinal(CK_SESSION_HANDLE hSession) /* the session's handle */
|
|||
int rv;
|
||||
struct sc_pkcs11_session *session;
|
||||
|
||||
sc_pkcs11_lock();
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
|
||||
rv = pool_find(&session_pool, hSession, (void**) &session);
|
||||
if (rv != CKR_OK)
|
||||
|
@ -317,7 +329,9 @@ CK_RV C_DigestInit(CK_SESSION_HANDLE hSession, /* the session's handle */
|
|||
int rv;
|
||||
struct sc_pkcs11_session *session;
|
||||
|
||||
sc_pkcs11_lock();
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
|
||||
rv = pool_find(&session_pool, hSession, (void**) &session);
|
||||
if (rv == CKR_OK)
|
||||
|
@ -337,7 +351,9 @@ CK_RV C_Digest(CK_SESSION_HANDLE hSession, /* the session's handle */
|
|||
int rv;
|
||||
struct sc_pkcs11_session *session;
|
||||
|
||||
sc_pkcs11_lock();
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
|
||||
rv = pool_find(&session_pool, hSession, (void**) &session);
|
||||
if (rv != CKR_OK)
|
||||
|
@ -360,7 +376,9 @@ CK_RV C_DigestUpdate(CK_SESSION_HANDLE hSession, /* the session's handle */
|
|||
int rv;
|
||||
struct sc_pkcs11_session *session;
|
||||
|
||||
sc_pkcs11_lock();
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
|
||||
rv = pool_find(&session_pool, hSession, (void**) &session);
|
||||
if (rv == CKR_OK)
|
||||
|
@ -384,7 +402,9 @@ CK_RV C_DigestFinal(CK_SESSION_HANDLE hSession, /* the session's handle */
|
|||
int rv;
|
||||
struct sc_pkcs11_session *session;
|
||||
|
||||
sc_pkcs11_lock();
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
|
||||
rv = pool_find(&session_pool, hSession, (void**) &session);
|
||||
if (rv == CKR_OK)
|
||||
|
@ -407,7 +427,9 @@ CK_RV C_SignInit(CK_SESSION_HANDLE hSession, /* the session's handle */
|
|||
struct sc_pkcs11_object *object;
|
||||
int rv;
|
||||
|
||||
sc_pkcs11_lock();
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
|
||||
rv = pool_find(&session_pool, hSession, (void**) &session);
|
||||
if (rv != CKR_OK)
|
||||
|
@ -452,7 +474,9 @@ CK_RV C_Sign(CK_SESSION_HANDLE hSession, /* the session's handle */
|
|||
struct sc_pkcs11_session *session;
|
||||
CK_ULONG length;
|
||||
|
||||
sc_pkcs11_lock();
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
|
||||
rv = pool_find(&session_pool, hSession, (void**) &session);
|
||||
if (rv != CKR_OK)
|
||||
|
@ -489,7 +513,9 @@ CK_RV C_SignUpdate(CK_SESSION_HANDLE hSession, /* the session's handle */
|
|||
struct sc_pkcs11_session *session;
|
||||
int rv;
|
||||
|
||||
sc_pkcs11_lock();
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
|
||||
rv = pool_find(&session_pool, hSession, (void**) &session);
|
||||
if (rv == CKR_OK)
|
||||
|
@ -508,7 +534,9 @@ CK_RV C_SignFinal(CK_SESSION_HANDLE hSession, /* the session's handle */
|
|||
CK_ULONG length;
|
||||
int rv;
|
||||
|
||||
sc_pkcs11_lock();
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
|
||||
rv = pool_find(&session_pool, hSession, (void**) &session);
|
||||
if (rv != CKR_OK)
|
||||
|
@ -547,7 +575,9 @@ CK_RV C_SignRecoverInit(CK_SESSION_HANDLE hSession, /* the session's handle */
|
|||
struct sc_pkcs11_object *object;
|
||||
int rv;
|
||||
|
||||
sc_pkcs11_lock();
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
|
||||
rv = pool_find(&session_pool, hSession, (void**) &session);
|
||||
if (rv != CKR_OK)
|
||||
|
@ -737,7 +767,9 @@ CK_RV C_UnwrapKey(CK_SESSION_HANDLE hSession, /* the session's handl
|
|||
struct sc_pkcs11_object *object, *result;
|
||||
int rv;
|
||||
|
||||
sc_pkcs11_lock();
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
|
||||
rv = pool_find(&session_pool, hSession, (void**) &session);
|
||||
if (rv != CKR_OK)
|
||||
|
@ -785,7 +817,9 @@ CK_RV C_SeedRandom(CK_SESSION_HANDLE hSession, /* the session's handle */
|
|||
struct sc_pkcs11_session *session;
|
||||
int rv;
|
||||
|
||||
sc_pkcs11_lock();
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
|
||||
rv = pool_find(&session_pool, hSession, (void**) &session);
|
||||
if (rv == CKR_OK)
|
||||
|
@ -806,7 +840,9 @@ CK_RV C_GenerateRandom(CK_SESSION_HANDLE hSession, /* the session's handle */
|
|||
struct sc_pkcs11_session *session;
|
||||
int rv;
|
||||
|
||||
sc_pkcs11_lock();
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
|
||||
rv = pool_find(&session_pool, hSession, (void**) &session);
|
||||
if (rv == CKR_OK)
|
||||
|
|
|
@ -33,7 +33,9 @@ CK_RV C_OpenSession(CK_SLOT_ID slotID, /* the slot's ID */
|
|||
struct sc_pkcs11_session *session;
|
||||
int rv;
|
||||
|
||||
sc_pkcs11_lock();
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
|
||||
debug(context, "Opening new session for slot %d\n", slotID);
|
||||
|
||||
|
@ -75,7 +77,9 @@ CK_RV C_CloseSession(CK_SESSION_HANDLE hSession) /* the session's handle */
|
|||
struct sc_pkcs11_session *session;
|
||||
int rv;
|
||||
|
||||
sc_pkcs11_lock();
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
|
||||
rv = pool_find_and_delete(&session_pool, hSession, (void**) &session);
|
||||
if (rv != CKR_OK)
|
||||
|
@ -122,8 +126,12 @@ CK_RV C_CloseAllSessions(CK_SLOT_ID slotID) /* the token's slot */
|
|||
{
|
||||
int rv;
|
||||
|
||||
sc_pkcs11_lock();
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
|
||||
rv = sc_pkcs11_close_all_sessions(slotID);
|
||||
|
||||
sc_pkcs11_unlock();
|
||||
return rv;
|
||||
}
|
||||
|
@ -134,7 +142,9 @@ CK_RV C_GetSessionInfo(CK_SESSION_HANDLE hSession, /* the session's handle */
|
|||
struct sc_pkcs11_session *session;
|
||||
int rv;
|
||||
|
||||
sc_pkcs11_lock();
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
|
||||
rv = pool_find(&session_pool, hSession, (void**) &session);
|
||||
if (rv != CKR_OK)
|
||||
|
@ -187,7 +197,9 @@ CK_RV C_Login(CK_SESSION_HANDLE hSession, /* the session's handle */
|
|||
struct sc_pkcs11_session *session;
|
||||
struct sc_pkcs11_slot *slot;
|
||||
|
||||
sc_pkcs11_lock();
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
|
||||
if (userType != CKU_USER && userType != CKU_SO) {
|
||||
rv = CKR_USER_TYPE_INVALID;
|
||||
|
@ -228,7 +240,9 @@ CK_RV C_Logout(CK_SESSION_HANDLE hSession) /* the session's handle */
|
|||
struct sc_pkcs11_session *session;
|
||||
struct sc_pkcs11_slot *slot;
|
||||
|
||||
sc_pkcs11_lock();
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
|
||||
rv = pool_find(&session_pool, hSession, (void**) &session);
|
||||
if (rv != CKR_OK)
|
||||
|
@ -255,7 +269,9 @@ CK_RV C_InitPIN(CK_SESSION_HANDLE hSession,
|
|||
struct sc_pkcs11_slot *slot;
|
||||
int rv;
|
||||
|
||||
sc_pkcs11_lock();
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
|
||||
rv = pool_find(&session_pool, hSession, (void**) &session);
|
||||
if (rv != CKR_OK)
|
||||
|
@ -286,7 +302,9 @@ CK_RV C_SetPIN(CK_SESSION_HANDLE hSession,
|
|||
struct sc_pkcs11_session *session;
|
||||
struct sc_pkcs11_slot *slot;
|
||||
|
||||
sc_pkcs11_lock();
|
||||
rv = sc_pkcs11_lock();
|
||||
if (rv != CKR_OK)
|
||||
return rv;
|
||||
|
||||
rv = pool_find(&session_pool, hSession, (void**) &session);
|
||||
if (rv != CKR_OK)
|
||||
|
|
|
@ -381,7 +381,7 @@ void load_pkcs11_parameters(struct sc_pkcs11_config *, struct sc_context *);
|
|||
|
||||
/* Locking primitives at the pkcs11 level */
|
||||
CK_RV sc_pkcs11_init_lock(CK_C_INITIALIZE_ARGS_PTR);
|
||||
void sc_pkcs11_lock(void);
|
||||
CK_RV sc_pkcs11_lock(void);
|
||||
void sc_pkcs11_unlock(void);
|
||||
void sc_pkcs11_free_lock(void);
|
||||
|
||||
|
|
Loading…
Reference in New Issue