[Pkg-gnupg-commit] [gnupg2] 75/166: scd: Fix RESET command handling.
Daniel Kahn Gillmor
dkg at fifthhorseman.net
Thu Mar 16 22:33:07 UTC 2017
This is an automated email from the git hooks/post-receive script.
dkg pushed a commit to branch experimental
in repository gnupg2.
commit e2792813a55e091c51be7b1b089a71beb6466f1d
Author: NIIBE Yutaka <gniibe at fsij.org>
Date: Wed Feb 15 18:23:01 2017 +0900
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 <gniibe at fsij.org>
---
scd/app.c | 52 ++++++++++++++++++++++++----------------------------
1 file changed, 24 insertions(+), 28 deletions(-)
diff --git a/scd/app.c b/scd/app.c
index 7e72870..29c9dad 100644
--- a/scd/app.c
+++ b/scd/app.c
@@ -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)
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-gnupg/gnupg2.git
More information about the Pkg-gnupg-commit
mailing list