[Pkg-gnupg-commit] [gnupg2] 21/124: gpg: Fix attempt to double free an UID structure.

Daniel Kahn Gillmor dkg at fifthhorseman.net
Wed Apr 5 15:55:28 UTC 2017


This is an automated email from the git hooks/post-receive script.

dkg pushed a commit to branch experimental
in repository gnupg2.

commit 4a130bbc2c2f4be6e8c6357512a943f435ade28f
Author: Werner Koch <wk at gnupg.org>
Date:   Sun Mar 5 23:24:15 2017 +0100

    gpg: Fix attempt to double free an UID structure.
    
    * g10/getkey.c (get_best_pubkey_byname): Set released .UID to NULL.
    --
    
    Phil Pennock reported an assertion failure when doing
    
      % gpg --auto-key-locate dane --locate-keys someone
      gpg: Ohhhh jeeee: Assertion "uid->ref > 0" in \
             free_user_id failed (free-packet.c:310)
    
    on his keyring.  This patch is not tested but a good guess.
    
    Signed-off-by: Werner Koch <wk at gnupg.org>
---
 g10/getkey.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/g10/getkey.c b/g10/getkey.c
index 163ab80..be7367f 100644
--- a/g10/getkey.c
+++ b/g10/getkey.c
@@ -1592,8 +1592,10 @@ get_best_pubkey_byname (ctrl_t ctrl, GETKEY_CTX *retctx, PKT_public_key *pk,
   if (is_valid_mailbox (name) && ctx)
     {
       /* Rank results and return only the most relevant key.  */
-      struct pubkey_cmp_cookie best = { 0 }, new;
-      KBNODE new_keyblock;
+      struct pubkey_cmp_cookie best = { 0 };
+      struct pubkey_cmp_cookie new;
+      kbnode_t new_keyblock;
+
       while (getkey_next (ctx, &new.key, &new_keyblock) == 0)
         {
           int diff = pubkey_cmp (ctrl, name, &best, &new, new_keyblock);
@@ -1610,17 +1612,20 @@ get_best_pubkey_byname (ctrl_t ctrl, GETKEY_CTX *retctx, PKT_public_key *pk,
               /* Old key is better.  */
               release_public_key_parts (&new.key);
               free_user_id (new.uid);
+              new.uid = NULL;
             }
           else
             {
               /* A tie.  Keep the old key.  */
               release_public_key_parts (&new.key);
               free_user_id (new.uid);
+              new.uid = NULL;
             }
         }
       getkey_end (ctx);
       ctx = NULL;
       free_user_id (best.uid);
+      best.uid = NULL;
 
       if (best.valid)
         {

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-gnupg/gnupg2.git



More information about the Pkg-gnupg-commit mailing list