diff options
author | NIIBE Yutaka <[email protected]> | 2019-09-11 02:05:03 +0000 |
---|---|---|
committer | NIIBE Yutaka <[email protected]> | 2019-09-11 02:05:03 +0000 |
commit | 92be4e87eec984a3f3737339c311761d2650c55a (patch) | |
tree | 8f3196d013696aa8336b3f0cfa103e714277111d /scd/apdu.c | |
parent | scd,pcsc: Fix for initializing PC/SC. (diff) | |
download | gnupg-92be4e87eec984a3f3737339c311761d2650c55a.tar.gz gnupg-92be4e87eec984a3f3737339c311761d2650c55a.zip |
scd,pcsc: Fix examining the list of readers.
* scd/apdu.c (apdu_dev_list_start): Traverse the string+NUL carefully.
Signed-off-by: NIIBE Yutaka <[email protected]>
Diffstat (limited to 'scd/apdu.c')
-rw-r--r-- | scd/apdu.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/scd/apdu.c b/scd/apdu.c index 958b47e1a..af747c07d 100644 --- a/scd/apdu.c +++ b/scd/apdu.c @@ -1998,17 +1998,25 @@ apdu_dev_list_start (const char *portstr, struct dev_list **l_p) while (nreader) { - if (!*p && !p[1]) + size_t n; + + if (!*p) break; - log_info ("detected reader '%s'\n", p); - if (nreader < (strlen (p)+1)) + + for (n = 0; n < nreader; n++) + if (!p[n]) + break; + + if (n >= nreader) { log_error ("invalid response from pcsc_list_readers\n"); break; } + + log_info ("detected reader '%s'\n", p); pcsc.rdrname[dl->idx_max] = p; - nreader -= strlen (p)+1; - p += strlen (p) + 1; + nreader -= n + 1; + p += n + 1; dl->idx_max++; if (dl->idx_max >= MAX_READER) { |