gpg: Fix export bug using exact search with only one key in the keybox.
authorWerner Koch <wk@gnupg.org>
Mon, 1 Dec 2014 10:54:51 +0000 (11:54 +0100)
committerWerner Koch <wk@gnupg.org>
Mon, 1 Dec 2014 10:54:51 +0000 (11:54 +0100)
* g10/export.c (do_export_stream): Disable caching.
* g10/keyserver.c (keyidlist): Ditto.
--

GnuPG-bug-id: 1774

g10/export.c
g10/keydb.c
g10/keyserver.c

index a92eace..b65fb8d 100644 (file)
@@ -804,6 +804,8 @@ do_export_stream (ctrl_t ctrl, iobuf_t out, strlist_t users, int secret,
                        sl->d, gpg_strerror (err));
         }
 
                        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
       /* 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
index bafae18..a578c7c 100644 (file)
@@ -1424,6 +1424,9 @@ keydb_search (KEYDB_HANDLE hd, KEYDB_SEARCH_DESC *desc,
   if (DBG_CACHE)
     dump_search_desc (hd, "keydb_search", desc, ndesc);
 
   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
   if (!hd->no_caching
       && ndesc == 1
       && (desc[0].mode == KEYDB_SEARCH_MODE_FPR20
index 5bc1eba..e3ad707 100644 (file)
@@ -1229,7 +1229,8 @@ keyidlist(strlist_t users,KEYDB_SEARCH_DESC **klist,int *count,int fakev3)
 
   *klist=xmalloc(sizeof(KEYDB_SEARCH_DESC)*num);
 
 
   *klist=xmalloc(sizeof(KEYDB_SEARCH_DESC)*num);
 
-  kdbhd=keydb_new ();
+  kdbhd = keydb_new ();
+  keydb_disable_caching (kdbhd);  /* We are looping the search.  */
 
   if(!users)
     {
 
   if(!users)
     {