gpg: Improve import slowness.

* g10/import.c (read_block): Avoid O(N^2) append.
(sec_to_pub_keyblock): Likewise.

Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
(cherry picked from commit 33c17a8008)

Gbp-Pq: Topic from-master
Gbp-Pq: Name gpg-Improve-import-slowness.patch
This commit is contained in:
NIIBE Yutaka 2019-07-10 15:42:07 +09:00 committed by Daniel Kahn Gillmor
parent 9e12829299
commit f56d60f43b
1 changed files with 13 additions and 5 deletions

View File

@ -853,6 +853,7 @@ read_block( IOBUF a, unsigned int options,
struct parse_packet_ctx_s parsectx; struct parse_packet_ctx_s parsectx;
PACKET *pkt; PACKET *pkt;
kbnode_t root = NULL; kbnode_t root = NULL;
kbnode_t lastnode = NULL;
int in_cert, in_v3key, skip_sigs; int in_cert, in_v3key, skip_sigs;
u32 keyid[2]; u32 keyid[2];
int got_keyid = 0; int got_keyid = 0;
@ -862,7 +863,7 @@ read_block( IOBUF a, unsigned int options,
if (*pending_pkt) if (*pending_pkt)
{ {
root = new_kbnode( *pending_pkt ); root = lastnode = new_kbnode( *pending_pkt );
*pending_pkt = NULL; *pending_pkt = NULL;
log_assert (root->pkt->pkttype == PKT_PUBLIC_KEY log_assert (root->pkt->pkttype == PKT_PUBLIC_KEY
|| root->pkt->pkttype == PKT_SECRET_KEY); || root->pkt->pkttype == PKT_SECRET_KEY);
@ -1032,9 +1033,12 @@ read_block( IOBUF a, unsigned int options,
if (in_cert && valid_keyblock_packet (pkt->pkttype)) if (in_cert && valid_keyblock_packet (pkt->pkttype))
{ {
if (!root ) if (!root )
root = new_kbnode (pkt); root = lastnode = new_kbnode (pkt);
else else
add_kbnode (root, new_kbnode (pkt)); {
lastnode->next = new_kbnode (pkt);
lastnode = lastnode->next;
}
pkt = xmalloc (sizeof *pkt); pkt = xmalloc (sizeof *pkt);
} }
else else
@ -2605,6 +2609,7 @@ sec_to_pub_keyblock (kbnode_t sec_keyblock)
kbnode_t pub_keyblock = NULL; kbnode_t pub_keyblock = NULL;
kbnode_t ctx = NULL; kbnode_t ctx = NULL;
kbnode_t secnode, pubnode; kbnode_t secnode, pubnode;
kbnode_t lastnode = NULL;
unsigned int tag = 0; unsigned int tag = 0;
/* Set a tag to all nodes. */ /* Set a tag to all nodes. */
@ -2644,9 +2649,12 @@ sec_to_pub_keyblock (kbnode_t sec_keyblock)
pubnode->tag = secnode->tag; pubnode->tag = secnode->tag;
if (!pub_keyblock) if (!pub_keyblock)
pub_keyblock = pubnode; pub_keyblock = lastnode = pubnode;
else else
add_kbnode (pub_keyblock, pubnode); {
lastnode->next = pubnode;
lastnode = pubnode;
}
} }
return pub_keyblock; return pub_keyblock;