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 <gniibe@fsij.org>
This commit is contained in:
NIIBE Yutaka 2019-09-11 11:05:03 +09:00
parent 441106cdf0
commit 92be4e87ee
1 changed files with 13 additions and 5 deletions

View File

@ -1998,17 +1998,25 @@ apdu_dev_list_start (const char *portstr, struct dev_list **l_p)
while (nreader) while (nreader)
{ {
if (!*p && !p[1]) size_t n;
if (!*p)
break; 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"); log_error ("invalid response from pcsc_list_readers\n");
break; break;
} }
log_info ("detected reader '%s'\n", p);
pcsc.rdrname[dl->idx_max] = p; pcsc.rdrname[dl->idx_max] = p;
nreader -= strlen (p)+1; nreader -= n + 1;
p += strlen (p) + 1; p += n + 1;
dl->idx_max++; dl->idx_max++;
if (dl->idx_max >= MAX_READER) if (dl->idx_max >= MAX_READER)
{ {