aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJakub Jelen <[email protected]>2021-04-13 12:02:18 +0000
committerWerner Koch <[email protected]>2021-05-20 13:19:19 +0000
commit678e1b20d3531e642fa8871ea56c6c7d5c208fbe (patch)
tree93a7bf55ab9b0c71a20d16de55dcd90cf3b11cda
parentcommon: Avoid double-free (diff)
downloadgnupg-678e1b20d3531e642fa8871ea56c6c7d5c208fbe.tar.gz
gnupg-678e1b20d3531e642fa8871ea56c6c7d5c208fbe.zip
scd: avoid memory leaks
* scd/app-p15.c (send_certinfo): free labelbuf (do_sign): goto leave instead of return * scd/command.c (cmd_genkey): goto leave instead of return -- Signed-off-by: Jakub Jelen <[email protected]> GnuPG-bug-id: 5393 Modifified for this backport: * scd/command.c (cmd_genkey): Make it easier to read by replacing keyno with orig_line. Signed-off-by: Werner Koch <[email protected]>
-rw-r--r--scd/app-p15.c5
-rw-r--r--scd/command.c33
2 files changed, 24 insertions, 14 deletions
diff --git a/scd/app-p15.c b/scd/app-p15.c
index 3aa8122f5..0530d377c 100644
--- a/scd/app-p15.c
+++ b/scd/app-p15.c
@@ -3851,6 +3851,7 @@ send_certinfo (app_t app, ctrl_t ctrl, const char *certtype,
labelbuf, strlen (labelbuf),
NULL, (size_t)0);
xfree (buf);
+ xfree (labelbuf);
}
return 0;
}
@@ -5461,7 +5462,7 @@ do_sign (app_t app, ctrl_t ctrl, const char *keyidstr, int hashalgo,
if (err)
{
log_error ("p15: MSE failed: %s\n", gpg_strerror (err));
- return err;
+ goto leave;
}
/* Now that we have all the information available run the actual PIN
@@ -5500,7 +5501,7 @@ do_sign (app_t app, ctrl_t ctrl, const char *keyidstr, int hashalgo,
if (err)
{
log_error ("p15: MSE failed: %s\n", gpg_strerror (err));
- return err;
+ goto leave;
}
if (prkdf->keyalgo == GCRY_PK_RSA && prkdf->keynbits > 2048)
diff --git a/scd/command.c b/scd/command.c
index 2e2627f71..e2debf5b8 100644
--- a/scd/command.c
+++ b/scd/command.c
@@ -1113,7 +1113,7 @@ cmd_genkey (assuan_context_t ctx, char *line)
{
ctrl_t ctrl = assuan_get_pointer (ctx);
int rc;
- char *keyno;
+ char *save_line;
int force;
const char *s;
time_t timestamp;
@@ -1134,26 +1134,35 @@ cmd_genkey (assuan_context_t ctx, char *line)
line = skip_options (line);
if (!*line)
- return set_error (GPG_ERR_ASS_PARAMETER, "no key number given");
- keyno = line;
+ {
+ rc = set_error (GPG_ERR_ASS_PARAMETER, "no key number given");
+ goto leave;
+ }
+ save_line = line;
while (*line && !spacep (line))
line++;
*line = 0;
if ((rc = open_card (ctrl)))
- return rc;
+ goto leave;
if (!ctrl->app_ctx)
- return gpg_error (GPG_ERR_UNSUPPORTED_OPERATION);
+ {
+ rc = gpg_error (GPG_ERR_UNSUPPORTED_OPERATION);
+ goto leave;
+ }
- keyno = xtrystrdup (keyno);
- if (!keyno)
- return out_of_core ();
- rc = app_genkey (ctrl->app_ctx, ctrl, keyno, NULL,
- force? APP_GENKEY_FLAG_FORCE : 0,
- timestamp, pin_cb, ctx);
- xfree (keyno);
+ {
+ char *tmp = xtrystrdup (save_line);
+ if (!tmp)
+ return gpg_error_from_syserror ();
+ rc = app_genkey (ctrl->app_ctx, ctrl, tmp, NULL,
+ force? APP_GENKEY_FLAG_FORCE : 0,
+ timestamp, pin_cb, ctx);
+ xfree (tmp);
+ }
+ leave:
return rc;
}