diff options
author | Werner Koch <[email protected]> | 2009-05-06 09:31:15 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2009-05-06 09:31:15 +0000 |
commit | 23ad4bd73bf57b786f1d9d75b958772e6f19638a (patch) | |
tree | 68b41409a1b113cc240e0993b594d7a7beb6ac1c | |
parent | Improve dotlocking. (diff) | |
download | gnupg-23ad4bd73bf57b786f1d9d75b958772e6f19638a.tar.gz gnupg-23ad4bd73bf57b786f1d9d75b958772e6f19638a.zip |
Fix for bug#1034.
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | g10/ChangeLog | 7 | ||||
-rw-r--r-- | g10/getkey.c | 12 | ||||
-rw-r--r-- | g10/keyring.c | 51 |
4 files changed, 38 insertions, 34 deletions
@@ -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); } |