From 5b9af968518344ba92b7023428280873fab1d34e Mon Sep 17 00:00:00 2001 From: Frank Morgner Date: Tue, 3 Mar 2020 15:09:17 +0100 Subject: [PATCH] pkcs11: reclaim unused slots based on reader description When a reader is removed and reattached, this re-uses the old slot without relying on the fact that the sc_reader_t is unchanged. --- src/pkcs11/pkcs11-global.c | 5 ++--- src/pkcs11/slot.c | 46 ++++++++++++++++++++++++++++++++------ 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/src/pkcs11/pkcs11-global.c b/src/pkcs11/pkcs11-global.c index 25c4cd36..95c37f3c 100644 --- a/src/pkcs11/pkcs11-global.c +++ b/src/pkcs11/pkcs11-global.c @@ -468,8 +468,7 @@ CK_RV C_GetSlotList(CK_BBOOL tokenPresent, /* only slots with token prese for (i=0; iname, 64); + strcpy_bp(manufacturerID, reader->vendor, 32); /* Locate a slot related to the reader */ for (i = 0; ireader == reader) return slot; + if (slot->reader == NULL && reader != NULL + && 0 == memcmp(slot->slot_info.slotDescription, slotDescription, 64) + && 0 == memcmp(slot->slot_info.manufacturerID, manufacturerID, 32) + && slot->slot_info.hardwareVersion.major == reader->version_major + && slot->slot_info.hardwareVersion.minor == reader->version_minor) + return slot; } return NULL; } @@ -82,8 +93,8 @@ static int object_list_seeker(const void *el, const void *key) CK_RV create_slot(sc_reader_t *reader) { - /* find unused virtual hotplug slots */ - struct sc_pkcs11_slot *slot = reader_get_slot(NULL); + /* find unused slots previously allocated for the same reader */ + struct sc_pkcs11_slot *slot = reader_reclaim_slot(reader); /* create a new slot if no empty slot is available */ if (!slot) { @@ -373,11 +384,32 @@ card_detect_all(void) * possible according to PKCS#11 2.20 and later, because NSS can't * handle a shrinking slot list * https://bugzilla.mozilla.org/show_bug.cgi?id=1613632 */ + + /* Instead, remove the releation between reader and slot */ + for (i = 0; ireader == reader) { + slot->reader = NULL; + } + } } else { - if (!reader_get_slot(reader)) - initialize_reader(reader); - else - card_detect(sc_ctx_get_reader(context, i)); + /* Locate a slot related to the reader */ + int found = 0; + for (i = 0; ireader == reader) { + found = 1; + break; + } + } + if (!found) { + for (i = 0; i < sc_pkcs11_conf.slots_per_card; i++) { + CK_RV rv = create_slot(reader); + if (rv != CKR_OK) + return rv; + } + } + card_detect(reader); } } sc_log(context, "All cards detected");