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:
sth 2003-02-19 13:44:36 +00:00
parent 57954682fd
commit 958658102d
4 changed files with 139 additions and 38 deletions

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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);