summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcus Brinkmann <mb@g10code.com>2006-04-14 22:40:00 +0200
committerMarcus Brinkmann <mb@g10code.com>2006-04-14 22:40:00 +0200
commit751a3aeea79f2b5e7a21b768ea18e4cb22cfc2ca (patch)
tree9f1bda5fae52b08a37df1c0c0731b35657b847e8
parentAdded command APDU (diff)
downloadgnupg2-751a3aeea79f2b5e7a21b768ea18e4cb22cfc2ca.tar.xz
gnupg2-751a3aeea79f2b5e7a21b768ea18e4cb22cfc2ca.zip
2006-04-14 Marcus Brinkmann <marcus@g10code.de>
* app.c (select_application): Cover up a slot mismatch error in case it happens (it shouldn't happen). (release_application): Use APP->slot. Lock the reader. (application_notify_card_removed): Lock the reader.
-rw-r--r--scd/ChangeLog7
-rw-r--r--scd/app.c47
2 files changed, 35 insertions, 19 deletions
diff --git a/scd/ChangeLog b/scd/ChangeLog
index 53ef676f9..8015359a5 100644
--- a/scd/ChangeLog
+++ b/scd/ChangeLog
@@ -1,3 +1,10 @@
+2006-04-14 Marcus Brinkmann <marcus@g10code.de>
+
+ * app.c (select_application): Cover up a slot mismatch error in
+ case it happens (it shouldn't happen).
+ (release_application): Use APP->slot. Lock the reader.
+ (application_notify_card_removed): Lock the reader.
+
2006-04-11 Werner Koch <wk@g10code.com>
* command.c (hex_to_buffer): New.
diff --git a/scd/app.c b/scd/app.c
index 7f6a8cc9f..363e386ce 100644
--- a/scd/app.c
+++ b/scd/app.c
@@ -161,22 +161,25 @@ is_app_allowed (const char *name)
void
application_notify_card_removed (int slot)
{
+ app_t app;
+
if (slot < 0 || slot >= DIM (lock_table))
return;
+ /* FIXME: We are ignoring any error value here. */
+ lock_reader (slot);
+
/* Deallocate a saved application for that slot, so that we won't
try to reuse it. If there is no saved application, set a flag so
that we won't save the current state. */
- if (lock_table[slot].initialized)
- {
- app_t app = lock_table[slot].last_app;
+ app = lock_table[slot].last_app;
- if (app)
- {
- lock_table[slot].last_app = NULL;
- deallocate_app (app);
- }
+ if (app)
+ {
+ lock_table[slot].last_app = NULL;
+ deallocate_app (app);
}
+ unlock_reader (slot);
}
@@ -262,6 +265,8 @@ select_application (ctrl_t ctrl, int slot, const char *name, app_t *r_app)
{
if (app->slot != slot)
log_bug ("slot mismatch %d/%d\n", app->slot, slot);
+ app->slot = slot;
+
app->ref_count++;
*r_app = app;
unlock_reader (slot);
@@ -400,18 +405,22 @@ release_application (app_t app)
return;
/* Move the reference to the application in the lock table. */
- for (slot = 0; slot < DIM (lock_table); slot++)
- if (lock_table[slot].initialized && lock_table[slot].app == app)
- {
- if (lock_table[slot].last_app)
- deallocate_app (lock_table[slot].last_app);
- lock_table[slot].last_app = lock_table[slot].app;
- lock_table[slot].app = NULL;
- return;
- }
+ slot = app->slot;
+ /* FIXME: We are ignoring any error value. */
+ lock_reader (slot);
+ if (lock_table[slot].app != app)
+ {
+ unlock_reader (slot);
+ log_bug ("app mismatch %p/%p\n", app, lock_table[slot].app);
+ deallocate_app (app);
+ return;
+ }
- log_debug ("application missing in lock table - deallocating anyway\n");
- deallocate_app (app);
+ if (lock_table[slot].last_app)
+ deallocate_app (lock_table[slot].last_app);
+ lock_table[slot].last_app = lock_table[slot].app;
+ lock_table[slot].app = NULL;
+ unlock_reader (slot);
}