From a68fc6ec13f7dc21831204628e1eed1407f109c1 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Mon, 28 Jan 2008 18:46:08 +0000 Subject: [PATCH] Fixed bug 876 --- trunk/gpgme/ChangeLog | 4 ++++ trunk/gpgme/gpgme.h | 2 +- trunk/gpgme/keylist.c | 25 ++++++++++++++++++++----- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/trunk/gpgme/ChangeLog b/trunk/gpgme/ChangeLog index 6287bf6..776c858 100644 --- a/trunk/gpgme/ChangeLog +++ b/trunk/gpgme/ChangeLog @@ -1,3 +1,7 @@ +2008-01-28 Werner Koch + + * keylist.c (gpgme_get_key): Skip duplicated keys. Fixes bug 876. + 2008-01-14 Marcus Brinkmann * engine-gpgconf.c (gpgconf_config_load_cb): Fix program_name diff --git a/trunk/gpgme/gpgme.h b/trunk/gpgme/gpgme.h index bf42035..1133e0d 100644 --- a/trunk/gpgme/gpgme.h +++ b/trunk/gpgme/gpgme.h @@ -72,7 +72,7 @@ extern "C" { AM_PATH_GPGME macro) check that this header matches the installed library. Warning: Do not edit the next line. configure will do that for you! */ -#define GPGME_VERSION "1.1.6-svn1282" +#define GPGME_VERSION "1.1.7-svn1295" diff --git a/trunk/gpgme/keylist.c b/trunk/gpgme/keylist.c index 0f88cf7..69b0dc9 100644 --- a/trunk/gpgme/keylist.c +++ b/trunk/gpgme/keylist.c @@ -1,6 +1,7 @@ /* keylist.c - Listing keys. Copyright (C) 2000 Werner Koch (dd9jn) - Copyright (C) 2001, 2002, 2003, 2004, 2006, 2007 g10 Code GmbH + Copyright (C) 2001, 2002, 2003, 2004, 2006, 2007, + 2008 g10 Code GmbH This file is part of GPGME. @@ -15,9 +16,8 @@ Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ + License along with this program; if not, see . + */ #if HAVE_CONFIG_H #include @@ -964,11 +964,26 @@ gpgme_get_key (gpgme_ctx_t ctx, const char *fpr, gpgme_key_t *r_key, err = gpgme_op_keylist_next (listctx, r_key); if (!err) { + try_next_key: err = gpgme_op_keylist_next (listctx, &key); if (gpgme_err_code (err) == GPG_ERR_EOF) - err = gpg_error (GPG_ERR_NO_ERROR); + err = 0; else { + if (!err + && *r_key && (*r_key)->subkeys && (*r_key)->subkeys->fpr + && key && key->subkeys && key->subkeys->fpr + && !strcmp ((*r_key)->subkeys->fpr, key->subkeys->fpr)) + { + /* The fingerprint is identical. We assume that this is + the same key and don't mark it as an ambiguous. This + problem may occur with corrupted keyrings and has + been noticed often with gpgsm. In fact gpgsm uses a + similar hack to sort out such duplicates but it can't + do that while listing keys. */ + gpgme_key_unref (key); + goto try_next_key; + } if (!err) { gpgme_key_unref (key); -- 2.26.2