diff options
author | Marcus Brinkmann <mb@g10code.com> | 2006-04-14 22:40:00 +0200 |
---|---|---|
committer | Marcus Brinkmann <mb@g10code.com> | 2006-04-14 22:40:00 +0200 |
commit | 751a3aeea79f2b5e7a21b768ea18e4cb22cfc2ca (patch) | |
tree | 9f1bda5fae52b08a37df1c0c0731b35657b847e8 /scd/app.c | |
parent | Added command APDU (diff) | |
download | gnupg2-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.
Diffstat (limited to 'scd/app.c')
-rw-r--r-- | scd/app.c | 47 |
1 files changed, 28 insertions, 19 deletions
@@ -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); } |