aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNIIBE Yutaka <[email protected]>2015-04-30 03:36:38 +0000
committerNIIBE Yutaka <[email protected]>2015-05-01 05:16:28 +0000
commit3f9f33bbcb40146c6f09277a28d499188ed34ef2 (patch)
tree10f857ad6a81859996187cf69a12f66192731486
parentg10: fix cmp_public_key and cmp_secret_keys. (diff)
downloadgnupg-3f9f33bbcb40146c6f09277a28d499188ed34ef2.tar.gz
gnupg-3f9f33bbcb40146c6f09277a28d499188ed34ef2.zip
scd: PC/SC reader selection by partial string match.
* scd/apdu.c (open_pcsc_reader_direct): Partial string match. * scd/pcsc-wrapper.c (handle_open): Likewise. -- (backport from 2.1 commit 01a2a61bc4b34817c4216888265f65d59a33dad3) The card reader name by PC/SC service might include USB bus, which varies (on some platform like GNU/Linux). Thus, it's better to match partial string. Original patch was submitted by anstein. I changed it to fallback to the first reader if no match found. GnuPG-bug-id: 1618, 1930
-rw-r--r--scd/apdu.c15
-rw-r--r--scd/pcsc-wrapper.c16
2 files changed, 21 insertions, 10 deletions
diff --git a/scd/apdu.c b/scd/apdu.c
index 6fc11486f..72b291e8f 100644
--- a/scd/apdu.c
+++ b/scd/apdu.c
@@ -1870,7 +1870,8 @@ open_pcsc_reader_direct (const char *portstr)
long err;
int slot;
char *list = NULL;
- pcsc_dword_t nreader, listlen;
+ char *rdrname = NULL;
+ pcsc_dword_t nreader;
char *p;
slot = new_reader_slot ();
@@ -1917,24 +1918,27 @@ open_pcsc_reader_direct (const char *portstr)
return -1;
}
- listlen = nreader;
p = list;
while (nreader)
{
if (!*p && !p[1])
break;
- if (*p)
- log_info ("detected reader `%s'\n", p);
+ log_info ("detected reader `%s'\n", p);
if (nreader < (strlen (p)+1))
{
log_error ("invalid response from pcsc_list_readers\n");
break;
}
+ if (!rdrname && portstr && !strncmp (p, portstr, strlen (portstr)))
+ rdrname = p;
nreader -= strlen (p)+1;
p += strlen (p) + 1;
}
- reader_table[slot].rdrname = xtrymalloc (strlen (portstr? portstr : list)+1);
+ if (!rdrname)
+ rdrname = list;
+
+ reader_table[slot].rdrname = xtrystrdup (rdrname);
if (!reader_table[slot].rdrname)
{
log_error ("error allocating memory for reader name\n");
@@ -1943,7 +1947,6 @@ open_pcsc_reader_direct (const char *portstr)
unlock_slot (slot);
return -1;
}
- strcpy (reader_table[slot].rdrname, portstr? portstr : list);
xfree (list);
list = NULL;
diff --git a/scd/pcsc-wrapper.c b/scd/pcsc-wrapper.c
index 4dc44eef9..b83e21861 100644
--- a/scd/pcsc-wrapper.c
+++ b/scd/pcsc-wrapper.c
@@ -406,8 +406,9 @@ static void
handle_open (unsigned char *argbuf, size_t arglen)
{
long err;
- const char * portstr;
+ const char *portstr;
char *list = NULL;
+ char *rdrname = NULL;
pcsc_dword_t nreader, atrlen;
char *p;
pcsc_dword_t card_state, card_protocol;
@@ -416,7 +417,10 @@ handle_open (unsigned char *argbuf, size_t arglen)
/* Make sure there is only the port string */
if (arglen != strlen ((char*)argbuf))
bad_request ("OPEN");
- portstr = (char*)argbuf;
+ if (arglen == 0)
+ portstr = NULL;
+ else
+ portstr = (char*)argbuf;
if (driver_is_open)
{
@@ -466,17 +470,21 @@ handle_open (unsigned char *argbuf, size_t arglen)
fprintf (stderr, PGM": invalid response from pcsc_list_readers\n");
break;
}
+ if (!rdrname && portstr && !strncmp (p, portstr, strlen (portstr)))
+ rdrname = p;
nreader -= strlen (p)+1;
p += strlen (p) + 1;
}
- current_rdrname = malloc (strlen (portstr && *portstr? portstr:list)+1);
+ if (!rdrname)
+ rdrname = list;
+
+ current_rdrname = strdup (rdrname);
if (!current_rdrname)
{
fprintf (stderr, PGM": error allocating memory for reader name\n");
exit (1);
}
- strcpy (current_rdrname, portstr && *portstr? portstr:list);
free (list);
err = pcsc_connect (pcsc_context,