aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gpgme/ChangeLog4
-rw-r--r--gpgme/gpgme.h2
-rw-r--r--gpgme/keylist.c25
3 files changed, 25 insertions, 6 deletions
diff --git a/gpgme/ChangeLog b/gpgme/ChangeLog
index 6287bf66..776c8582 100644
--- a/gpgme/ChangeLog
+++ b/gpgme/ChangeLog
@@ -1,3 +1,7 @@
+2008-01-28 Werner Koch <[email protected]>
+
+ * keylist.c (gpgme_get_key): Skip duplicated keys. Fixes bug 876.
+
2008-01-14 Marcus Brinkmann <[email protected]>
* engine-gpgconf.c (gpgconf_config_load_cb): Fix program_name
diff --git a/gpgme/gpgme.h b/gpgme/gpgme.h
index bf42035e..1133e0d3 100644
--- a/gpgme/gpgme.h
+++ b/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/gpgme/keylist.c b/gpgme/keylist.c
index 0f88cf74..69b0dc9e 100644
--- a/gpgme/keylist.c
+++ b/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 <http://www.gnu.org/licenses/>.
+ */
#if HAVE_CONFIG_H
#include <config.h>
@@ -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);