[git] GnuPG - branch, master, updated. gnupg-2.1.10-34-g2e4e10c

by Neal H. Walfield cvs at cvs.gnupg.org
Tue Dec 15 12:21:34 CET 2015


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "The GNU Privacy Guard".

The branch, master has been updated
       via  2e4e10c1dcd8dfeafec51f44ebf26acfeb770c41 (commit)
      from  0ea186db645da2b51a7e71f46793d447f2de5e3d (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 2e4e10c1dcd8dfeafec51f44ebf26acfeb770c41
Author: Neal H. Walfield <neal at g10code.com>
Date:   Tue Dec 15 12:21:30 2015 +0100

    gpg: Improve the keyblock cache's transparency.
    
    * kbx/keybox-search.c (keybox_offset): New function.
    * g10/keydb.c (struct keyblock_cache): Add fields resource and offset.
    (keyblock_cache_clear): Reset HD->KEYBLOCK_CACHE.RESOURCE and
    HD->KEYBLOCK_CACHE.OFFSET.
    (keydb_search): Don't use the cached result if it comes before the
    current file position.  When caching an entry, also record the
    position at which it was found.
    
    --
    Signed-off-by: Neal H. Walfield <neal at g10code.com>
    GnuPG-bug-id: 2187

diff --git a/g10/keydb.c b/g10/keydb.c
index d7c35de..860187f 100644
--- a/g10/keydb.c
+++ b/g10/keydb.c
@@ -81,6 +81,9 @@ struct keyblock_cache {
   u32 *sigstatus;
   int pk_no;
   int uid_no;
+  /* Offset of the record in the keybox.  */
+  int resource;
+  off_t offset;
 };
 
 
@@ -245,6 +248,8 @@ keyblock_cache_clear (struct keydb_handle *hd)
   hd->keyblock_cache.sigstatus = NULL;
   iobuf_close (hd->keyblock_cache.iobuf);
   hd->keyblock_cache.iobuf = NULL;
+  hd->keyblock_cache.resource = -1;
+  hd->keyblock_cache.offset = -1;
 }
 
 
@@ -1701,7 +1706,13 @@ keydb_search (KEYDB_HANDLE hd, KEYDB_SEARCH_DESC *desc,
       && (desc[0].mode == KEYDB_SEARCH_MODE_FPR20
           || desc[0].mode == KEYDB_SEARCH_MODE_FPR)
       && hd->keyblock_cache.state  == KEYBLOCK_CACHE_FILLED
-      && !memcmp (hd->keyblock_cache.fpr, desc[0].u.fpr, 20))
+      && !memcmp (hd->keyblock_cache.fpr, desc[0].u.fpr, 20)
+      /* Make sure the current file position occurs before the cached
+         result to avoid an infinite loop.  */
+      && (hd->current < hd->keyblock_cache.resource
+          || (hd->current == hd->keyblock_cache.resource
+              && (keybox_offset (hd->active[hd->current].u.kb)
+                  <= hd->keyblock_cache.offset))))
     {
       /* (DESCINDEX is already set).  */
       if (DBG_CLOCK)
@@ -1772,6 +1783,12 @@ keydb_search (KEYDB_HANDLE hd, KEYDB_SEARCH_DESC *desc,
       && hd->active[hd->current].type == KEYDB_RESOURCE_TYPE_KEYBOX)
     {
       hd->keyblock_cache.state = KEYBLOCK_CACHE_PREPARED;
+      hd->keyblock_cache.resource = hd->current;
+      /* The current offset is at the start of the next record.  Since
+         a record is at least 1 byte, we just use offset - 1, which is
+         within the record.  */
+      hd->keyblock_cache.offset
+        = keybox_offset (hd->active[hd->current].u.kb) - 1;
       memcpy (hd->keyblock_cache.fpr, desc[0].u.fpr, 20);
     }
 
diff --git a/kbx/keybox-search.c b/kbx/keybox-search.c
index 78e0c23..df959b6 100644
--- a/kbx/keybox-search.c
+++ b/kbx/keybox-search.c
@@ -1188,3 +1188,11 @@ keybox_get_flags (KEYBOX_HANDLE hd, int what, int idx, unsigned int *value)
   ec = get_flag_from_image (buffer, length, what, value);
   return ec? gpg_error (ec):0;
 }
+
+off_t
+keybox_offset (KEYBOX_HANDLE hd)
+{
+  if (!hd->fp)
+    return 0;
+  return ftello (hd->fp);
+}
diff --git a/kbx/keybox.h b/kbx/keybox.h
index 8c31141..c91a282 100644
--- a/kbx/keybox.h
+++ b/kbx/keybox.h
@@ -77,6 +77,8 @@ int keybox_set_ephemeral (KEYBOX_HANDLE hd, int yes);
 
 int keybox_lock (KEYBOX_HANDLE hd, int yes);
 
+off_t keybox_offset (KEYBOX_HANDLE hd);
+
 /*-- keybox-file.c --*/
 /* Fixme: This function does not belong here: Provide a better
    interface to create a new keybox file.  */

-----------------------------------------------------------------------

Summary of changes:
 g10/keydb.c         | 19 ++++++++++++++++++-
 kbx/keybox-search.c |  8 ++++++++
 kbx/keybox.h        |  2 ++
 3 files changed, 28 insertions(+), 1 deletion(-)


hooks/post-receive
-- 
The GNU Privacy Guard
http://git.gnupg.org




More information about the Gnupg-commits mailing list