aboutsummaryrefslogtreecommitdiffstats
path: root/g10/getkey.c
diff options
context:
space:
mode:
authorJustus Winter <[email protected]>2016-11-15 14:06:28 +0000
committerJustus Winter <[email protected]>2016-11-15 14:38:09 +0000
commitbd60742925414e0ef2a497df827c1913ea211a44 (patch)
treee6d93e8edd5b1bb0578902223a40f300212e9164 /g10/getkey.c
parentsm: New stub option --compliance. (diff)
downloadgnupg-bd60742925414e0ef2a497df827c1913ea211a44.tar.gz
gnupg-bd60742925414e0ef2a497df827c1913ea211a44.zip
g10: Fix use-after-free.
* g10/getkey.c (pubkey_cmp): Make a copy of the user id. (get_best_pubkey_byname): Free the user ids. Signed-off-by: Justus Winter <[email protected]>
Diffstat (limited to 'g10/getkey.c')
-rw-r--r--g10/getkey.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/g10/getkey.c b/g10/getkey.c
index 59625e757..bf197b26e 100644
--- a/g10/getkey.c
+++ b/g10/getkey.c
@@ -1541,7 +1541,7 @@ pubkey_cmp (ctrl_t ctrl, const char *name, struct pubkey_cmp_cookie *old,
if (! match)
continue;
- new->uid = uid;
+ new->uid = scopy_user_id (uid);
new->validity =
get_validity (ctrl, &new->key, uid, NULL, 0) & TRUST_MASK;
new->valid = 1;
@@ -1602,21 +1602,29 @@ get_best_pubkey_byname (ctrl_t ctrl, GETKEY_CTX *retctx, PKT_public_key *pk,
{
/* New key is better. */
release_public_key_parts (&best.key);
+ if (best.uid)
+ free_user_id (best.uid);
best = new;
}
else if (diff > 0)
{
/* Old key is better. */
release_public_key_parts (&new.key);
+ if (new.uid)
+ free_user_id (new.uid);
}
else
{
/* A tie. Keep the old key. */
release_public_key_parts (&new.key);
+ if (new.uid)
+ free_user_id (new.uid);
}
}
getkey_end (ctx);
ctx = NULL;
+ if (best.uid)
+ free_user_id (best.uid);
if (best.valid)
{