aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2009-05-06 09:31:15 +0000
committerWerner Koch <[email protected]>2009-05-06 09:31:15 +0000
commit23ad4bd73bf57b786f1d9d75b958772e6f19638a (patch)
tree68b41409a1b113cc240e0993b594d7a7beb6ac1c
parentImprove dotlocking. (diff)
downloadgnupg-23ad4bd73bf57b786f1d9d75b958772e6f19638a.tar.gz
gnupg-23ad4bd73bf57b786f1d9d75b958772e6f19638a.zip
Fix for bug#1034.
-rw-r--r--NEWS2
-rw-r--r--g10/ChangeLog7
-rw-r--r--g10/getkey.c12
-rw-r--r--g10/keyring.c51
4 files changed, 38 insertions, 34 deletions
diff --git a/NEWS b/NEWS
index e76bcdb08..d66a33aff 100644
--- a/NEWS
+++ b/NEWS
@@ -6,6 +6,8 @@ Noteworthy changes in version 1.4.10 (unreleased)
* Improved file locking. Implemented it for W32.
+ * Fixed a memory leak which made imports of many keys very slow.
+
Noteworthy changes in version 1.4.9 (2008-03-26)
------------------------------------------------
diff --git a/g10/ChangeLog b/g10/ChangeLog
index 7b5b5464d..7c4d57875 100644
--- a/g10/ChangeLog
+++ b/g10/ChangeLog
@@ -1,3 +1,10 @@
+2009-05-06 Werner Koch <[email protected]>
+
+ * keyring.c (keyring_get_keyblock): Fix memory leak due to
+ ring_trust packets. Fixes bug#1034.
+
+ * getkey.c (finish_lookup): Remove dead code.
+
2009-05-05 Werner Koch <[email protected]>
* keygen.c (read_parameter_file): Add keyword "Creation-Date".
diff --git a/g10/getkey.c b/g10/getkey.c
index 267eee541..4506c7c92 100644
--- a/g10/getkey.c
+++ b/g10/getkey.c
@@ -2541,17 +2541,7 @@ finish_lookup (GETKEY_CTX ctx)
latest_key = foundk? foundk:keyblock;
goto found;
}
-
- if (!req_usage) {
- PKT_public_key *pk = foundk->pkt->pkt.public_key;
- if (pk->user_id)
- free_user_id (pk->user_id);
- pk->user_id = scopy_user_id (foundu);
- ctx->found_key = foundk;
- cache_user_id( keyblock );
- return 1; /* found */
- }
-
+
latest_date = 0;
latest_key = NULL;
/* do not look at subkeys if a certification key is requested */
diff --git a/g10/keyring.c b/g10/keyring.c
index f4bca709e..ee6509678 100644
--- a/g10/keyring.c
+++ b/g10/keyring.c
@@ -419,38 +419,43 @@ keyring_get_keyblock (KEYRING_HANDLE hd, KBNODE *ret_kb)
if ( lastnode
&& lastnode->pkt->pkttype == PKT_SIGNATURE
&& (pkt->pkt.ring_trust->sigcache & 1) ) {
- /* this is a ring trust packet with a checked signature
+ /* This is a ring trust packet with a checked signature
* status cache following directly a signature paket.
- * Set the cache status into that signature packet */
+ * Set the cache status into that signature packet. */
PKT_signature *sig = lastnode->pkt->pkt.signature;
sig->flags.checked = 1;
sig->flags.valid = !!(pkt->pkt.ring_trust->sigcache & 2);
}
- /* reset lastnode, so that we set the cache status only from
- * the ring trust packet immediately folling a signature */
+ /* Reset LASTNODE, so that we set the cache status only
+ * from the ring trust packets immediately following
+ * signature packets. */
lastnode = NULL;
- }
- else {
- node = lastnode = new_kbnode (pkt);
- if (!keyblock)
- keyblock = node;
- else
- add_kbnode (keyblock, node);
-
- if ( pkt->pkttype == PKT_PUBLIC_KEY
- || pkt->pkttype == PKT_PUBLIC_SUBKEY
- || pkt->pkttype == PKT_SECRET_KEY
- || pkt->pkttype == PKT_SECRET_SUBKEY) {
- if (++pk_no == hd->found.pk_no)
- node->flag |= 1;
- }
- else if ( pkt->pkttype == PKT_USER_ID) {
- if (++uid_no == hd->found.uid_no)
- node->flag |= 2;
- }
+ free_packet(pkt);
+ init_packet(pkt);
+ continue;
}
+ node = lastnode = new_kbnode (pkt);
+ if (!keyblock)
+ keyblock = node;
+ else
+ add_kbnode (keyblock, node);
+
+ if ( pkt->pkttype == PKT_PUBLIC_KEY
+ || pkt->pkttype == PKT_PUBLIC_SUBKEY
+ || pkt->pkttype == PKT_SECRET_KEY
+ || pkt->pkttype == PKT_SECRET_SUBKEY)
+ {
+ if (++pk_no == hd->found.pk_no)
+ node->flag |= 1;
+ }
+ else if ( pkt->pkttype == PKT_USER_ID)
+ {
+ if (++uid_no == hd->found.uid_no)
+ node->flag |= 2;
+ }
+
pkt = xmalloc (sizeof *pkt);
init_packet(pkt);
}