Pinpad input problem for GemPC Pinpad reader

NIIBE Yutaka gniibe at fsij.org
Fri Jan 11 03:43:08 CET 2013


On 2013-01-10 at 17:15 +0900, NIIBE Yutaka wrote:
> It seems that GemPC Pinpad reader is single threaded.
> 
> I need to configure SCDaemon with debug-disable-ticker option to
> use the reader reliably (or I need to input quickly).
> 
> Here is a log when I don't configure debug-disable-ticker option.
> 
> When we were in use of pinpad, apdu_get_status got timeout (after 5
> seconds, the timeout value of bulk_out).  See usb_bulk_write
> failed: -110.

This is due to a bug which doesn't hold lock for _keypad functions.

Here is a patch to fix this (against master).  Same should be applied
to 2.0.

OK to commit?

diff --git a/scd/apdu.c b/scd/apdu.c
index 68d4e99..278e08a 100644
--- a/scd/apdu.c
+++ b/scd/apdu.c
@@ -3429,9 +3429,18 @@ apdu_check_keypad (int slot, int command, int pin_mode,
     return SW_HOST_NO_DRIVER;
 
   if (reader_table[slot].check_keypad)
-    return reader_table[slot].check_keypad (slot, command,
+    {
+      int sw;
+
+      if ((sw = lock_slot (slot)))
+        return sw;
+
+      sw = reader_table[slot].check_keypad (slot, command,
                                             pin_mode, pinlen_min, pinlen_max,
                                             pin_padlen);
+      unlock_slot (slot);
+      return sw;
+    }
   else
     return SW_HOST_NOT_SUPPORTED;
 }
@@ -3452,8 +3461,17 @@ apdu_keypad_verify (int slot, int class, int ins, int p0, int p1, int pin_mode,
     return SW_HOST_NO_DRIVER;
 
   if (reader_table[slot].keypad_verify)
-    return reader_table[slot].keypad_verify (slot, class, ins, p0, p1,
+    {
+      int sw;
+
+      if ((sw = lock_slot (slot)))
+        return sw;
+
+      sw = reader_table[slot].keypad_verify (slot, class, ins, p0, p1,
                                              &pininfo);
+      unlock_slot (slot);
+      return sw;
+    }
   else
     return SW_HOST_NOT_SUPPORTED;
 }
@@ -3474,8 +3492,17 @@ apdu_keypad_modify (int slot, int class, int ins, int p0, int p1, int pin_mode,
     return SW_HOST_NO_DRIVER;
 
   if (reader_table[slot].keypad_modify)
-    return reader_table[slot].keypad_modify (slot, class, ins, p0, p1,
+    {
+      int sw;
+
+      if ((sw = lock_slot (slot)))
+        return sw;
+
+      sw = reader_table[slot].keypad_modify (slot, class, ins, p0, p1,
                                              &pininfo);
+      unlock_slot (slot);
+      return sw;
+    }
   else
     return SW_HOST_NOT_SUPPORTED;
 }
-- 





More information about the Gnupg-devel mailing list