1
0
mirror of git://git.gnupg.org/gnupg.git synced 2025-01-08 12:44:23 +01:00

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.
This commit is contained in:
Marcus Brinkmann 2006-04-14 20:40:00 +00:00
parent c664309a0a
commit 751a3aeea7
2 changed files with 35 additions and 19 deletions

View File

@ -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> 2006-04-11 Werner Koch <wk@g10code.com>
* command.c (hex_to_buffer): New. * command.c (hex_to_buffer): New.

View File

@ -161,22 +161,25 @@ is_app_allowed (const char *name)
void void
application_notify_card_removed (int slot) application_notify_card_removed (int slot)
{ {
app_t app;
if (slot < 0 || slot >= DIM (lock_table)) if (slot < 0 || slot >= DIM (lock_table))
return; return;
/* FIXME: We are ignoring any error value here. */
lock_reader (slot);
/* Deallocate a saved application for that slot, so that we won't /* 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 try to reuse it. If there is no saved application, set a flag so
that we won't save the current state. */ that we won't save the current state. */
if (lock_table[slot].initialized) app = lock_table[slot].last_app;
{
app_t app = lock_table[slot].last_app;
if (app) if (app)
{ {
lock_table[slot].last_app = NULL; lock_table[slot].last_app = NULL;
deallocate_app (app); 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) if (app->slot != slot)
log_bug ("slot mismatch %d/%d\n", app->slot, slot); log_bug ("slot mismatch %d/%d\n", app->slot, slot);
app->slot = slot;
app->ref_count++; app->ref_count++;
*r_app = app; *r_app = app;
unlock_reader (slot); unlock_reader (slot);
@ -400,18 +405,22 @@ release_application (app_t app)
return; return;
/* Move the reference to the application in the lock table. */ /* Move the reference to the application in the lock table. */
for (slot = 0; slot < DIM (lock_table); slot++) slot = app->slot;
if (lock_table[slot].initialized && lock_table[slot].app == app) /* 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;
}
if (lock_table[slot].last_app) if (lock_table[slot].last_app)
deallocate_app (lock_table[slot].last_app); deallocate_app (lock_table[slot].last_app);
lock_table[slot].last_app = lock_table[slot].app; lock_table[slot].last_app = lock_table[slot].app;
lock_table[slot].app = NULL; lock_table[slot].app = NULL;
return; unlock_reader (slot);
}
log_debug ("application missing in lock table - deallocating anyway\n");
deallocate_app (app);
} }