@@ -819,10 +819,41 @@ return(CACKEY_PCSC_E_GENERIC); } return(CACKEY_PCSC_S_OK); } + +/* + * SYNPOSIS + * void cackey_mark_slot_reset(struct cackey_slot *slot); + * + * ARGUMENTS + * None + * + * RETURN VALUE + * None + * + * NOTES + * This function marks a slot has having been reset, to later be cleaned up. + * Cleanup only happens when a PKCS#11 client calls C_FindObjectsInit. + * + */ +static void cackey_mark_slot_reset(struct cackey_slot *slot) { + if (slot == NULL) { + return; + } + + CACKEY_DEBUG_PRINTF("Called."); + + slot->slot_reset = 1; + slot->pcsc_card_connected = 0; + slot->token_flags = CKF_LOGIN_REQUIRED; + + CACKEY_DEBUG_PRINTF("Returning."); + + return; +} /* * SYNPOSIS * LONG cackey_reconnect_card(struct cackey_slot *slot, DWORD default_protocol, LPDWORD selected_protocol); * @@ -1215,11 +1246,11 @@ if (scard_xmit_ret != SCARD_S_SUCCESS) { CACKEY_DEBUG_PRINTF("Failed to send APDU to card (SCardTransmit() = %s/%lx)", CACKEY_DEBUG_FUNC_SCARDERR_TO_STR(scard_xmit_ret), (unsigned long) scard_xmit_ret); CACKEY_DEBUG_PRINTF("Marking slot as having been reset"); - slot->slot_reset = 1; + cackey_mark_slot_reset(slot); if (scard_xmit_ret == SCARD_W_RESET_CARD) { CACKEY_DEBUG_PRINTF("Reset required, please hold..."); scard_reconn_ret = cackey_reconnect_card(slot, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, &protocol); @@ -2177,20 +2208,20 @@ cackey_end_transaction(slot); if (respcode == 0x6982) { CACKEY_DEBUG_PRINTF("Security status not satisified. Returning NEEDLOGIN"); - slot->slot_reset = 1; + cackey_mark_slot_reset(slot); slot->token_flags = CKF_LOGIN_REQUIRED; return(CACKEY_PCSC_E_NEEDLOGIN); } if (send_ret == CACKEY_PCSC_E_TOKENABSENT) { CACKEY_DEBUG_PRINTF("Token absent. Returning TOKENABSENT"); - slot->slot_reset = 1; + cackey_mark_slot_reset(slot); slot->token_flags = CKF_LOGIN_REQUIRED; return(CACKEY_PCSC_E_TOKENABSENT); } @@ -2399,13 +2430,11 @@ atr_len = sizeof(atr); status_ret = SCardStatus(slot->pcsc_card, NULL, &reader_len, &state, &protocol, atr, &atr_len); if (status_ret == SCARD_E_INVALID_HANDLE) { CACKEY_DEBUG_PRINTF("SCardStatus() returned SCARD_E_INVALID_HANDLE, marking is not already connected and trying again"); - slot->pcsc_card_connected = 0; - slot->slot_reset = 1; - slot->token_flags = CKF_LOGIN_REQUIRED; + cackey_mark_slot_reset(slot); pcsc_connect_ret = cackey_connect_card(slot); if (pcsc_connect_ret != CACKEY_PCSC_S_OK) { CACKEY_DEBUG_PRINTF("Unable to connect to card, returning token absent"); @@ -2415,12 +2444,11 @@ atr_len = sizeof(atr); status_ret = SCardStatus(slot->pcsc_card, NULL, &reader_len, &state, &protocol, atr, &atr_len); } if (status_ret != SCARD_S_SUCCESS) { - slot->slot_reset = 1; - slot->token_flags = CKF_LOGIN_REQUIRED; + cackey_mark_slot_reset(slot); if (status_ret == SCARD_W_RESET_CARD) { CACKEY_DEBUG_PRINTF("Reset required, please hold..."); scard_reconn_ret = cackey_reconnect_card(slot, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, &protocol); @@ -3393,10 +3421,12 @@ cackey_slots[currslot].transaction_depth = 0; cackey_slots[currslot].transaction_need_hw_lock = 0; cackey_slots[currslot].slot_reset = 1; cackey_slots[currslot].token_flags = CKF_LOGIN_REQUIRED; cackey_slots[currslot].label = NULL; + + cackey_mark_slot_reset(&cackey_slots[currslot]); } currslot++; pcsc_readers += curr_reader_len + 1; } @@ -4535,13 +4565,11 @@ if (cackey_slots[slotID].label != NULL) { free(cackey_slots[slotID].label); cackey_slots[slotID].label = NULL; } - cackey_slots[slotID].slot_reset = 0; - cackey_slots[slotID].pcsc_card_connected = 0; - cackey_slots[slotID].token_flags = CKF_LOGIN_REQUIRED; + cackey_mark_slot_reset(&cackey_slots[slotID]); } if (cackey_sessions[hSession].identities == NULL) { cackey_sessions[hSession].identities = cackey_read_identities(&cackey_slots[slotID], &cackey_sessions[hSession].identities_count); }