aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNIIBE Yutaka <[email protected]>2019-07-10 06:42:07 +0000
committerNIIBE Yutaka <[email protected]>2019-07-10 06:42:07 +0000
commit33c17a8008c3ba3bb740069f9f97c7467f156b54 (patch)
treea2d02a269f2c4072e7a96f098d7d0e7ca88d9b49
parentgpg: Fix keyring retrieval. (diff)
downloadgnupg-33c17a8008c3ba3bb740069f9f97c7467f156b54.tar.gz
gnupg-33c17a8008c3ba3bb740069f9f97c7467f156b54.zip
gpg: Improve import slowness.
* g10/import.c (read_block): Avoid O(N^2) append. (sec_to_pub_keyblock): Likewise. Signed-off-by: NIIBE Yutaka <[email protected]>
-rw-r--r--g10/import.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/g10/import.c b/g10/import.c
index 32c0f65cb..c32dbf059 100644
--- a/g10/import.c
+++ b/g10/import.c
@@ -864,6 +864,7 @@ read_block( IOBUF a, unsigned int options,
struct parse_packet_ctx_s parsectx;
PACKET *pkt;
kbnode_t root = NULL;
+ kbnode_t lastnode = NULL;
int in_cert, in_v3key, skip_sigs;
u32 keyid[2];
int got_keyid = 0;
@@ -873,7 +874,7 @@ read_block( IOBUF a, unsigned int options,
if (*pending_pkt)
{
- root = new_kbnode( *pending_pkt );
+ root = lastnode = new_kbnode( *pending_pkt );
*pending_pkt = NULL;
log_assert (root->pkt->pkttype == PKT_PUBLIC_KEY
|| root->pkt->pkttype == PKT_SECRET_KEY);
@@ -1041,9 +1042,12 @@ read_block( IOBUF a, unsigned int options,
if (in_cert && valid_keyblock_packet (pkt->pkttype))
{
if (!root )
- root = new_kbnode (pkt);
+ root = lastnode = new_kbnode (pkt);
else
- add_kbnode (root, new_kbnode (pkt));
+ {
+ lastnode->next = new_kbnode (pkt);
+ lastnode = lastnode->next;
+ }
pkt = xmalloc (sizeof *pkt);
}
else
@@ -2664,6 +2668,7 @@ sec_to_pub_keyblock (kbnode_t sec_keyblock)
kbnode_t pub_keyblock = NULL;
kbnode_t ctx = NULL;
kbnode_t secnode, pubnode;
+ kbnode_t lastnode = NULL;
unsigned int tag = 0;
/* Set a tag to all nodes. */
@@ -2703,9 +2708,12 @@ sec_to_pub_keyblock (kbnode_t sec_keyblock)
pubnode->tag = secnode->tag;
if (!pub_keyblock)
- pub_keyblock = pubnode;
+ pub_keyblock = lastnode = pubnode;
else
- add_kbnode (pub_keyblock, pubnode);
+ {
+ lastnode->next = pubnode;
+ lastnode = pubnode;
+ }
}
return pub_keyblock;