From f1c3eb4b16ca43b5d3712a3b54c22d17ce85af47 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Mon, 1 Dec 2014 11:54:51 +0100 Subject: gpg: Fix export bug using exact search with only one key in the keybox. * g10/export.c (do_export_stream): Disable caching. * g10/keyserver.c (keyidlist): Ditto. -- GnuPG-bug-id: 1774 --- g10/export.c | 2 ++ g10/keydb.c | 3 +++ g10/keyserver.c | 3 ++- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/g10/export.c b/g10/export.c index a92eace12..b65fb8d06 100644 --- a/g10/export.c +++ b/g10/export.c @@ -804,6 +804,8 @@ do_export_stream (ctrl_t ctrl, iobuf_t out, strlist_t users, int secret, sl->d, gpg_strerror (err)); } + keydb_disable_caching (kdbhd); /* We are looping the search. */ + /* It would be nice to see which of the given users did actually match one in the keyring. To implement this we need to have a found flag for each entry in desc. To set this flag we diff --git a/g10/keydb.c b/g10/keydb.c index bafae18a1..a578c7cb7 100644 --- a/g10/keydb.c +++ b/g10/keydb.c @@ -1424,6 +1424,9 @@ keydb_search (KEYDB_HANDLE hd, KEYDB_SEARCH_DESC *desc, if (DBG_CACHE) dump_search_desc (hd, "keydb_search", desc, ndesc); + /* NB: If one of the exact search modes below is used in a loop to + walk over all keys (with the same fingerprint) the caching must + have been disabled for the handle. */ if (!hd->no_caching && ndesc == 1 && (desc[0].mode == KEYDB_SEARCH_MODE_FPR20 diff --git a/g10/keyserver.c b/g10/keyserver.c index 5bc1eba83..e3ad70743 100644 --- a/g10/keyserver.c +++ b/g10/keyserver.c @@ -1229,7 +1229,8 @@ keyidlist(strlist_t users,KEYDB_SEARCH_DESC **klist,int *count,int fakev3) *klist=xmalloc(sizeof(KEYDB_SEARCH_DESC)*num); - kdbhd=keydb_new (); + kdbhd = keydb_new (); + keydb_disable_caching (kdbhd); /* We are looping the search. */ if(!users) { -- cgit v1.2.3