diff options
author | NIIBE Yutaka <[email protected]> | 2019-07-10 06:42:07 +0000 |
---|---|---|
committer | NIIBE Yutaka <[email protected]> | 2019-07-10 06:42:07 +0000 |
commit | 33c17a8008c3ba3bb740069f9f97c7467f156b54 (patch) | |
tree | a2d02a269f2c4072e7a96f098d7d0e7ca88d9b49 | |
parent | gpg: Fix keyring retrieval. (diff) | |
download | gnupg-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.c | 18 |
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; |