aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNIIBE Yutaka <[email protected]>2013-08-27 01:23:09 +0000
committerNIIBE Yutaka <[email protected]>2013-08-27 01:23:09 +0000
commitb6d54f1196d5f110fd94dfd661e74dbc60ca9811 (patch)
tree67b7b057f614e3509c680c128ac3f37a43ae84a1
parentscd: fix Vega for Alpha reader. (diff)
downloadgnupg-b6d54f1196d5f110fd94dfd661e74dbc60ca9811.tar.gz
gnupg-b6d54f1196d5f110fd94dfd661e74dbc60ca9811.zip
scd: fix parsing login-data DO.
* scd/app-openpgp.c (parse_login_data): Release RELPTR. Fix parsing. -- Signed-off-by: NIIBE Yutaka
-rw-r--r--scd/app-openpgp.c25
1 files changed, 13 insertions, 12 deletions
diff --git a/scd/app-openpgp.c b/scd/app-openpgp.c
index 673570d3f..011c24840 100644
--- a/scd/app-openpgp.c
+++ b/scd/app-openpgp.c
@@ -660,7 +660,11 @@ parse_login_data (app_t app)
if (*buffer == '\n')
break;
if (buflen < 2 || buffer[1] != '\x14')
- return; /* No control sequences. */
+ {
+ xfree (relptr);
+ return; /* No control sequences. */
+ }
+
buflen--;
buffer++;
do
@@ -707,14 +711,11 @@ parse_login_data (app_t app)
m = strtol (q, &q, 10);
}
- buffer = q;
if (buflen < ((unsigned char *)q - buffer))
- {
- buflen = 0;
- break;
- }
- else
- buflen -= ((unsigned char *)q - buffer);
+ break;
+
+ buflen -= ((unsigned char *)q - buffer);
+ buffer = q;
if (buflen && !(*buffer == '\n' || *buffer == '\x18'))
goto next;
@@ -725,11 +726,11 @@ parse_login_data (app_t app)
}
}
next:
- for (; buflen && *buffer != '\x18'; buflen--, buffer++)
- if (*buffer == '\n')
- buflen = 1;
+ /* Skip to FS (0x18) or LF (\n). */
+ for (; buflen && *buffer != '\x18' && *buffer != '\n'; buflen--)
+ buffer++;
}
- while (buflen);
+ while (buflen && *buffer != '\n');
xfree (relptr);
}