[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