diff options
author | NIIBE Yutaka <[email protected]> | 2017-02-15 09:23:01 +0000 |
---|---|---|
committer | NIIBE Yutaka <[email protected]> | 2017-02-15 09:23:01 +0000 |
commit | e2792813a55e091c51be7b1b089a71beb6466f1d (patch) | |
tree | 3f406f9c06d05f489069b1d0b4b3f49bea38e912 | |
parent | gpg: Make --export-ssh-key work for the primary key. (diff) | |
download | gnupg-e2792813a55e091c51be7b1b089a71beb6466f1d.tar.gz gnupg-e2792813a55e091c51be7b1b089a71beb6466f1d.zip |
scd: Fix RESET command handling.
* scd/app.c (release_application_internal): Remove.
(release_application): Merge release_application_internal.
(app_reset): Kick the loop and let close the reader. Sleep is
required here to wait closing.
(scd_update_reader_status_file): When APP is no use, close it.
Signed-off-by: NIIBE Yutaka <[email protected]>
-rw-r--r-- | scd/app.c | 52 |
1 files changed, 24 insertions, 28 deletions
@@ -136,40 +136,28 @@ check_application_conflict (const char *name, app_t app) } -static void -release_application_internal (app_t app) -{ - if (!app->ref_count) - log_bug ("trying to release an already released context\n"); - - --app->ref_count; -} - gpg_error_t app_reset (app_t app, ctrl_t ctrl, int send_reset) { gpg_error_t err; - err = lock_app (app, ctrl); - if (err) - return err; - if (send_reset) { int sw = apdu_reset (app->slot); if (sw) err = gpg_error (GPG_ERR_CARD_RESET); - /* Release the same application which is used by other sessions. */ + /* Release the same application which is used by all sessions. */ send_client_notifications (app, 1); + scd_kick_the_loop (); + gnupg_sleep (1); } else { ctrl->app_ctx = NULL; - release_application_internal (app); + release_application (app); } - unlock_app (app); return err; } @@ -486,7 +474,10 @@ release_application (app_t app) are preserved. */ lock_app (app, NULL); - release_application_internal (app); + if (!app->ref_count) + log_bug ("trying to release an already released context\n"); + + --app->ref_count; unlock_app (app); } @@ -1028,20 +1019,25 @@ scd_update_reader_status_file (void) int sw; unsigned int status; - sw = apdu_get_status (a->slot, 0, &status); app_next = a->next; - if (sw == SW_HOST_NO_READER) - { - /* Most likely the _reader_ has been unplugged. */ - status = 0; - } - else if (sw) + if (a->ref_count == 0) + status = 0; + else { - /* Get status failed. Ignore that. */ - if (a->periodical_check_needed) - periodical_check_needed = 1; - continue; + sw = apdu_get_status (a->slot, 0, &status); + if (sw == SW_HOST_NO_READER) + { + /* Most likely the _reader_ has been unplugged. */ + status = 0; + } + else if (sw) + { + /* Get status failed. Ignore that. */ + if (a->periodical_check_needed) + periodical_check_needed = 1; + continue; + } } if (a->card_status != status) |