diff options
author | NIIBE Yutaka <[email protected]> | 2017-10-19 02:08:24 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2017-10-19 13:03:19 +0000 |
commit | d07de3862710d88bc80d6f6c5ca8da5cf38ff0eb (patch) | |
tree | 5589c23ccc2332c40ea4cdae4c411a1a0d637f88 | |
parent | gpg: Keep a lock during the read-update/insert cycle in import. (diff) | |
download | gnupg-d07de3862710d88bc80d6f6c5ca8da5cf38ff0eb.tar.gz gnupg-d07de3862710d88bc80d6f6c5ca8da5cf38ff0eb.zip |
g10: Fix find_and_check_key for multiple keyrings.
* g10/pkclist.c (find_and_check_key): Call get_validity on a specific
keyblock.
--
When we have multiple keyrings, get_validity after
get_best_pubkey_byname should access same keyring. Or else, the
situation of an expired key in keyring A but valid key in keyring B
causes SEGV.
Thanks to Guido Günther for the use case and the log.
Debian-bug-id: 878812
Signed-off-by: NIIBE Yutaka <[email protected]>
-rw-r--r-- | g10/pkclist.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/g10/pkclist.c b/g10/pkclist.c index 67d932e2a..220936c56 100644 --- a/g10/pkclist.c +++ b/g10/pkclist.c @@ -826,6 +826,7 @@ find_and_check_key (ctrl_t ctrl, const char *name, unsigned int use, { int rc; PKT_public_key *pk; + KBNODE keyblock = NULL; if (!name || !*name) return gpg_error (GPG_ERR_INV_USER_ID); @@ -838,7 +839,7 @@ find_and_check_key (ctrl_t ctrl, const char *name, unsigned int use, if (from_file) rc = get_pubkey_fromfile (ctrl, pk, name); else - rc = get_best_pubkey_byname (ctrl, NULL, pk, name, NULL, 0, 0); + rc = get_best_pubkey_byname (ctrl, NULL, pk, name, &keyblock, 0, 0); if (rc) { int code; @@ -861,6 +862,7 @@ find_and_check_key (ctrl_t ctrl, const char *name, unsigned int use, if (rc) { /* Key found but not usable for us (e.g. sign-only key). */ + release_kbnode (keyblock); send_status_inv_recp (3, name); /* Wrong key usage */ log_error (_("%s: skipped: %s\n"), name, gpg_strerror (rc) ); free_public_key (pk); @@ -872,7 +874,8 @@ find_and_check_key (ctrl_t ctrl, const char *name, unsigned int use, { int trustlevel; - trustlevel = get_validity (ctrl, NULL, pk, pk->user_id, NULL, 1); + trustlevel = get_validity (ctrl, keyblock, pk, pk->user_id, NULL, 1); + release_kbnode (keyblock); if ( (trustlevel & TRUST_FLAG_DISABLED) ) { /* Key has been disabled. */ |