[pkg-opensc-commit] [opensc] 55/295: libopensc: fix reopen SM after reader reconnect
Eric Dorland
eric at moszumanska.debian.org
Sat Jun 24 21:11:15 UTC 2017
This is an automated email from the git hooks/post-receive script.
eric pushed a commit to branch master
in repository opensc.
commit 1e82dbe5c79e431e4d1b333a91b329e0164a86c2
Author: Doug Engert <deengert at gmail.com>
Date: Fri Jul 22 12:41:39 2016 -0500
libopensc: fix reopen SM after reader reconnect
After card reset detected, run SM open under new transaction
Before trying to reestablish SM session or onte code that may
need to use a transaction, get the transaction that will be
used by the caller od sc_lock.
closes #837
---
src/libopensc/card.c | 21 ++++++++++++++-------
1 file changed, 14 insertions(+), 7 deletions(-)
diff --git a/src/libopensc/card.c b/src/libopensc/card.c
index 910cffb..45ea1b0 100644
--- a/src/libopensc/card.c
+++ b/src/libopensc/card.c
@@ -388,6 +388,7 @@ int sc_reset(sc_card_t *card, int do_cold_reset)
int sc_lock(sc_card_t *card)
{
int r = 0, r2 = 0;
+ int was_reset = 0;
if (card == NULL)
return SC_ERROR_INVALID_ARGUMENTS;
@@ -400,14 +401,12 @@ int sc_lock(sc_card_t *card)
if (card->lock_count == 0) {
if (card->reader->ops->lock != NULL) {
r = card->reader->ops->lock(card->reader);
- if (r == SC_ERROR_CARD_RESET || r == SC_ERROR_READER_REATTACHED) {
+ while (r == SC_ERROR_CARD_RESET || r == SC_ERROR_READER_REATTACHED) {
/* invalidate cache */
memset(&card->cache, 0, sizeof(card->cache));
card->cache.valid = 0;
-#ifdef ENABLE_SM
- if (card->sm_ctx.ops.open)
- card->sm_ctx.ops.open(card);
-#endif
+ if (was_reset++ > 4) /* TODO retry a few times */
+ break;
r = card->reader->ops->lock(card->reader);
}
}
@@ -416,13 +415,21 @@ int sc_lock(sc_card_t *card)
}
if (r == 0)
card->lock_count++;
+
+ if (r == 0 && was_reset > 0) {
+#ifdef ENABLE_SM
+ if (card->sm_ctx.ops.open)
+ card->sm_ctx.ops.open(card);
+#endif
+ }
+
r2 = sc_mutex_unlock(card->ctx, card->mutex);
if (r2 != SC_SUCCESS) {
- sc_log(card->ctx, "unable to release lock");
+ sc_log(card->ctx, "unable to release card->mutex lock");
r = r != SC_SUCCESS ? r : r2;
}
- return r;
+ LOG_FUNC_RETURN(card->ctx, r);
}
int sc_unlock(sc_card_t *card)
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-opensc/opensc.git
More information about the pkg-opensc-commit
mailing list