Do not temporarily set SC_READER_REMOVED on all readers (#1335)

* reader-pcsc: Do not temporarily set SC_READER_REMOVED on all readers

Fixes #1324.

* reader-cryptotokenkit: Do not temporarily set SC_READER_REMOVED on all readers

See #1324.
This commit is contained in:
David Ward 2018-05-18 07:11:49 -04:00 committed by Frank Morgner
parent 36b88c3ad7
commit 14afdf38e3
2 changed files with 60 additions and 54 deletions

View File

@ -543,8 +543,10 @@ err:
static int cryptotokenkit_detect_readers(sc_context_t *ctx)
{
size_t i;
NSUInteger j;
int r;
TKSmartCardSlotManager *mngr = [TKSmartCardSlotManager defaultManager];
NSMutableArray *slotNames;
LOG_FUNC_CALLED(ctx);
@ -554,38 +556,37 @@ static int cryptotokenkit_detect_readers(sc_context_t *ctx)
goto err;
}
/* temporarily mark all readers as removed */
for (i=0; i < sc_ctx_get_reader_count(ctx); i++) {
sc_reader_t *reader = sc_ctx_get_reader(ctx, i);
reader->flags |= SC_READER_REMOVED;
}
sc_log(ctx, "Probing CryptoTokenKit readers");
for (NSString *slotName in [mngr slotNames]) {
sc_reader_t *old_reader;
int found = 0;
const char *reader_name = [slotName UTF8String];
slotNames = [[mngr slotNames] mutableCopy];
/* check if existing readers were returned in the list */
for (i = 0; i < sc_ctx_get_reader_count(ctx); i++) {
sc_reader_t *reader = sc_ctx_get_reader(ctx, i);
if (reader == NULL) {
r = SC_ERROR_INTERNAL;
goto err;
}
for (j = 0; j < [slotNames count]; j++) {
if (!strcmp(reader->name, [slotNames[j] UTF8String]))
break;
}
if (j < [slotNames count]) {
/* existing reader found; remove it from the list */
[slotNames removeObjectAtIndex:j];
} else {
/* existing reader not found */
reader->flags |= SC_READER_REMOVED;
}
}
/* add readers remaining in the list */
for (NSString *slotName in slotNames) {
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
for (i=0; i < sc_ctx_get_reader_count(ctx) && !found; i++) {
old_reader = sc_ctx_get_reader(ctx, i);
if (old_reader == NULL) {
r = SC_ERROR_INTERNAL;
goto err;
}
if (!strcmp(old_reader->name, reader_name)) {
found = 1;
}
}
/* Reader already available, skip */
if (found) {
old_reader->flags &= ~SC_READER_REMOVED;
continue;
}
sc_log(ctx, "Found new CryptoTokenKit reader '%s'", reader_name);
sc_log(ctx, "Found new CryptoTokenKit reader '%s'", [slotName UTF8String]);
[mngr getSlotWithName:slotName reply:^(TKSmartCardSlot *slot) {
cryptotokenkit_use_reader(ctx, slot, NULL);
dispatch_semaphore_signal(sema);

View File

@ -1298,12 +1298,6 @@ static int pcsc_detect_readers(sc_context_t *ctx)
goto out;
}
/* temporarily mark all readers as removed */
for (i=0;i < sc_ctx_get_reader_count(ctx);i++) {
sc_reader_t *reader = sc_ctx_get_reader(ctx, i);
reader->flags |= SC_READER_REMOVED;
}
sc_log(ctx, "Probing PC/SC readers");
do {
@ -1359,28 +1353,39 @@ static int pcsc_detect_readers(sc_context_t *ctx)
goto out;
}
/* check if existing readers were returned in the list */
for (i = 0; i < sc_ctx_get_reader_count(ctx); i++) {
sc_reader_t *reader = sc_ctx_get_reader(ctx, i);
if (!reader) {
ret = SC_ERROR_INTERNAL;
goto out;
}
for (reader_name = reader_buf; *reader_name != '\x0';
reader_name += strlen(reader_name) + 1) {
if (!strcmp(reader->name, reader_name))
break;
}
if (*reader_name != '\x0') {
/* existing reader found; remove it from the list */
char *next_reader_name = reader_name + strlen(reader_name) + 1;
memmove(reader_name, next_reader_name,
(reader_buf + reader_buf_size) - next_reader_name);
reader_buf_size -= (next_reader_name - reader_name);
} else {
/* existing reader not found */
reader->flags |= SC_READER_REMOVED;
}
}
/* add readers remaining in the list */
for (reader_name = reader_buf; *reader_name != '\x0';
reader_name += strlen(reader_name) + 1) {
sc_reader_t *reader = NULL, *old_reader = NULL;
sc_reader_t *reader = NULL;
struct pcsc_private_data *priv = NULL;
int found = 0;
for (i=0;i < sc_ctx_get_reader_count(ctx) && !found;i++) {
old_reader = sc_ctx_get_reader(ctx, i);
if (old_reader == NULL) {
ret = SC_ERROR_INTERNAL;
goto out;
}
if (!strcmp(old_reader->name, reader_name)) {
found = 1;
}
}
/* Reader already available, skip */
if (found) {
old_reader->flags &= ~SC_READER_REMOVED;
continue;
}
ret = pcsc_add_reader(ctx, reader_name, strlen(reader_name), &reader);
if (ret != SC_SUCCESS) {