Fix a small memory leak in gcry_pk_get_keygrip.
authorWerner Koch <wk@gnupg.org>
Mon, 4 Apr 2011 14:27:36 +0000 (16:27 +0200)
committerWerner Koch <wk@gnupg.org>
Mon, 4 Apr 2011 14:27:36 +0000 (16:27 +0200)
These are two memory leaks, one in the generic code and one ECC
specific.  For an RSA key the first one accounted for 10 bytes, which
is not that small if applied on a large key database.

cipher/ChangeLog
cipher/ecc.c
cipher/pubkey.c

index 8961676..df27bab 100644 (file)
@@ -1,3 +1,10 @@
+2011-04-04  Werner Koch  <wk@g10code.com>
+
+       * ecc.c (compute_keygrip): Release L1 while parsing "curve".
+
+       * pubkey.c (gcry_pk_get_keygrip): Always release NAME and L2.
+       Reported by Ben Kibbey.
+
 2011-03-28  Werner Koch  <wk@g10code.com>
 
        * primegen.c (_gcry_generate_elg_prime): Make sure that PRIME is
index f809b53..bbff7ee 100644 (file)
@@ -1620,6 +1620,7 @@ compute_keygrip (gcry_md_hd_t md, gcry_sexp_t keyparam)
         tmpvalues[idx] = NULL;
 
       curve = _gcry_sexp_nth_string (l1, 1);
+      gcry_sexp_release (l1);
       if (!curve)
         {
           ec = GPG_ERR_INV_OBJ; /* Name missing or out of core. */
index 02eeecc..27fb7f7 100644 (file)
@@ -2401,6 +2401,7 @@ gcry_pk_get_keygrip (gcry_sexp_t key, unsigned char *array)
   int idx;
   const char *elems;
   gcry_md_hd_t md = NULL;
+  int okay = 0;
 
   REGISTER_DEFAULT_PUBKEYS;
 
@@ -2479,16 +2480,14 @@ gcry_pk_get_keygrip (gcry_sexp_t key, unsigned char *array)
     }
 
   memcpy (array, gcry_md_read (md, GCRY_MD_SHA1), 20);
-  gcry_md_close (md);
-  gcry_sexp_release (list);
-  return array;
+  okay = 1;
 
  fail:
   gcry_free (name);
   gcry_sexp_release (l2);
   gcry_md_close (md);
   gcry_sexp_release (list);
-  return NULL;
+  return okay? array : NULL;
 }