The number of elements being processed is known upfront. So allocate the
authorclaudio <claudio@openbsd.org>
Wed, 8 Sep 2021 16:37:20 +0000 (16:37 +0000)
committerclaudio <claudio@openbsd.org>
Wed, 8 Sep 2021 16:37:20 +0000 (16:37 +0000)
storage needed outside of the loop. This reduces the number of recallocarray
calls.
OK tb@

usr.sbin/rpki-client/mft.c
usr.sbin/rpki-client/roa.c

index bd8f9ee..782db41 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: mft.c,v 1.36 2021/07/13 18:39:39 job Exp $ */
+/*     $OpenBSD: mft.c,v 1.37 2021/09/08 16:37:20 claudio Exp $ */
 /*
  * Copyright (c) 2019 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -194,12 +194,6 @@ mft_parse_filehash(struct parse *p, const ASN1_OCTET_STRING *os)
        }
 
        /* Insert the filename and hash value. */
-
-       p->res->files = recallocarray(p->res->files, p->res->filesz,
-           p->res->filesz + 1, sizeof(struct mftfile));
-       if (p->res->files == NULL)
-               err(1, NULL);
-
        fent = &p->res->files[p->res->filesz++];
 
        fent->file = fn;
@@ -232,6 +226,10 @@ mft_parse_flist(struct parse *p, const ASN1_OCTET_STRING *os)
                goto out;
        }
 
+       p->res->files = calloc(sk_ASN1_TYPE_num(seq), sizeof(struct mftfile));
+       if (p->res->files == NULL)
+               err(1, NULL);
+
        for (i = 0; i < sk_ASN1_TYPE_num(seq); i++) {
                t = sk_ASN1_TYPE_value(seq, i);
                if (t->type != V_ASN1_SEQUENCE) {
index 787243d..3d433ec 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: roa.c,v 1.23 2021/08/01 22:29:49 job Exp $ */
+/*     $OpenBSD: roa.c,v 1.24 2021/09/08 16:37:20 claudio Exp $ */
 /*
  * Copyright (c) 2019 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -109,10 +109,6 @@ roa_parse_addr(const ASN1_OCTET_STRING *os, enum afi afi, struct parse *p)
                }
        }
 
-       p->res->ips = recallocarray(p->res->ips, p->res->ipsz, p->res->ipsz + 1,
-           sizeof(struct roa_ip));
-       if (p->res->ips == NULL)
-               err(1, NULL);
        res = &p->res->ips[p->res->ipsz++];
 
        res->addr = addr;
@@ -181,6 +177,12 @@ roa_parse_ipfam(const ASN1_OCTET_STRING *os, struct parse *p)
                goto out;
        }
 
+       /* will be called multiple times so use recallocarray */
+       p->res->ips = recallocarray(p->res->ips, p->res->ipsz,
+           p->res->ipsz + sk_ASN1_TYPE_num(sseq), sizeof(struct roa_ip));
+       if (p->res->ips == NULL)
+               err(1, NULL);
+
        for (i = 0; i < sk_ASN1_TYPE_num(sseq); i++) {
                t = sk_ASN1_TYPE_value(sseq, i);
                if (t->type != V_ASN1_SEQUENCE) {