Blame SOURCES/0024-p11_child-check-if-card-is-present-in-wait_for_card.patch

0d441c
From 7b647338a40d701c6a5bb51c48c10a31a6b72699 Mon Sep 17 00:00:00 2001
0d441c
From: Sumit Bose <sbose@redhat.com>
0d441c
Date: Thu, 30 Jan 2020 13:14:14 +0100
0d441c
Subject: [PATCH 24/25] p11_child: check if card is present in wait_for_card()
0d441c
MIME-Version: 1.0
0d441c
Content-Type: text/plain; charset=UTF-8
0d441c
Content-Transfer-Encoding: 8bit
0d441c
0d441c
Some implementations of C_WaitForSlotEvent() might return even if no
0d441c
card was inserted. So it has to be checked if a card is really present.
0d441c
0d441c
Resolves: https://pagure.io/SSSD/sssd/issue/4159
0d441c
0d441c
Reviewed-by: Pavel Březina <pbrezina@redhat.com>
0d441c
---
0d441c
 src/p11_child/p11_child_openssl.c | 47 ++++++++++++++++---------------
0d441c
 1 file changed, 25 insertions(+), 22 deletions(-)
0d441c
0d441c
diff --git a/src/p11_child/p11_child_openssl.c b/src/p11_child/p11_child_openssl.c
0d441c
index 56601b117..295715612 100644
0d441c
--- a/src/p11_child/p11_child_openssl.c
0d441c
+++ b/src/p11_child/p11_child_openssl.c
0d441c
@@ -1546,35 +1546,38 @@ static errno_t wait_for_card(CK_FUNCTION_LIST *module, CK_SLOT_ID *slot_id)
0d441c
     CK_RV rv;
0d441c
     CK_SLOT_INFO info;
0d441c
 
0d441c
-    rv = module->C_WaitForSlotEvent(wait_flags, slot_id, NULL);
0d441c
-    if (rv != CKR_OK) {
0d441c
-        if (rv != CKR_FUNCTION_NOT_SUPPORTED) {
0d441c
+    do {
0d441c
+        rv = module->C_WaitForSlotEvent(wait_flags, slot_id, NULL);
0d441c
+        if (rv != CKR_OK && rv != CKR_FUNCTION_NOT_SUPPORTED) {
0d441c
             DEBUG(SSSDBG_OP_FAILURE,
0d441c
                   "C_WaitForSlotEvent failed [%lu][%s].\n",
0d441c
                   rv, p11_kit_strerror(rv));
0d441c
             return EIO;
0d441c
         }
0d441c
 
0d441c
-        /* Poor man's wait */
0d441c
-        do {
0d441c
+        if (rv == CKR_FUNCTION_NOT_SUPPORTED) {
0d441c
+            /* Poor man's wait */
0d441c
             sleep(10);
0d441c
-            rv = module->C_GetSlotInfo(*slot_id, &info;;
0d441c
-            if (rv != CKR_OK) {
0d441c
-                DEBUG(SSSDBG_OP_FAILURE, "C_GetSlotInfo failed\n");
0d441c
-                return EIO;
0d441c
-            }
0d441c
-            DEBUG(SSSDBG_TRACE_ALL,
0d441c
-                  "Description [%s] Manufacturer [%s] flags [%lu] "
0d441c
-                  "removable [%s] token present [%s].\n",
0d441c
-                  info.slotDescription, info.manufacturerID, info.flags,
0d441c
-                  (info.flags & CKF_REMOVABLE_DEVICE) ? "true": "false",
0d441c
-                  (info.flags & CKF_TOKEN_PRESENT) ? "true": "false");
0d441c
-            if ((info.flags & CKF_REMOVABLE_DEVICE)
0d441c
-                    && (info.flags & CKF_TOKEN_PRESENT)) {
0d441c
-                break;
0d441c
-            }
0d441c
-        } while (true);
0d441c
-    }
0d441c
+        }
0d441c
+
0d441c
+        rv = module->C_GetSlotInfo(*slot_id, &info;;
0d441c
+        if (rv != CKR_OK) {
0d441c
+            DEBUG(SSSDBG_OP_FAILURE, "C_GetSlotInfo failed\n");
0d441c
+            return EIO;
0d441c
+        }
0d441c
+        DEBUG(SSSDBG_TRACE_ALL,
0d441c
+              "Description [%s] Manufacturer [%s] flags [%lu] "
0d441c
+              "removable [%s] token present [%s].\n",
0d441c
+              info.slotDescription, info.manufacturerID, info.flags,
0d441c
+              (info.flags & CKF_REMOVABLE_DEVICE) ? "true": "false",
0d441c
+              (info.flags & CKF_TOKEN_PRESENT) ? "true": "false");
0d441c
+
0d441c
+        /* Check if really a token is present */
0d441c
+        if ((info.flags & CKF_REMOVABLE_DEVICE)
0d441c
+                && (info.flags & CKF_TOKEN_PRESENT)) {
0d441c
+            break;
0d441c
+        }
0d441c
+    } while (true);
0d441c
 
0d441c
     return EOK;
0d441c
 }
0d441c
-- 
0d441c
2.20.1
0d441c