On Thu, May 12, 2022 at 10:17:30AM +0200, Theo Buehler wrote:
> Before refactoring the IP side, let's streamline the code a little.
> Populate struct ip in the leaf functions instead of handing it through
> several layers and copying it along the way. Pass in the afi instead of
> letting struct ip carry it.
Looks good to me OK claudio@
> Index: cert.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/rpki-client/cert.c,v
> retrieving revision 1.79
> diff -u -p -r1.79 cert.c
> --- cert.c 12 May 2022 07:45:27 -0000 1.79
> +++ cert.c 12 May 2022 08:09:07 -0000
> @@ -257,21 +257,28 @@ sbgp_assysnum(struct parse *p, X509_EXTE
> * Returns zero on failure, non-zero on success.
> */
> static int
> -sbgp_addr(struct parse *p, struct cert_ip *ip, const ASN1_BIT_STRING *bs)
> +sbgp_addr(struct parse *p, enum afi afi, const ASN1_BIT_STRING *bs)
> {
> - if (!ip_addr_parse(bs, ip->afi, p->fn, &ip->ip)) {
> + struct cert_ip ip;
> +
> + memset(&ip, 0, sizeof(struct cert_ip));
> +
> + ip.afi = afi;
> + ip.type = CERT_IP_ADDR;
> +
> + if (!ip_addr_parse(bs, afi, p->fn, &ip.ip)) {
> warnx("%s: RFC 3779 section 2.2.3.8: IPAddress: "
> "invalid IP address", p->fn);
> return 0;
> }
>
> - if (!ip_cert_compose_ranges(ip)) {
> + if (!ip_cert_compose_ranges(&ip)) {
> warnx("%s: RFC 3779 section 2.2.3.8: IPAddress: "
> "IP address range reversed", p->fn);
> return 0;
> }
>
> - return append_ip(p, ip);
> + return append_ip(p, &ip);
> }
>
> /*
> @@ -279,28 +286,47 @@ sbgp_addr(struct parse *p, struct cert_i
> * Returns zero on failure, non-zero on success.
> */
> static int
> -sbgp_addr_range(struct parse *p, struct cert_ip *ip,
> - const IPAddressRange *range)
> +sbgp_addr_range(struct parse *p, enum afi afi, const IPAddressRange *range)
> {
> - if (!ip_addr_parse(range->min, ip->afi, p->fn, &ip->range.min)) {
> + struct cert_ip ip;
> +
> + memset(&ip, 0, sizeof(struct cert_ip));
> +
> + ip.afi = afi;
> + ip.type = CERT_IP_RANGE;
> +
> + if (!ip_addr_parse(range->min, afi, p->fn, &ip.range.min)) {
> warnx("%s: RFC 3779 section 2.2.3.9: IPAddressRange: "
> "invalid IP address", p->fn);
> return 0;
> }
>
> - if (!ip_addr_parse(range->max, ip->afi, p->fn, &ip->range.max)) {
> + if (!ip_addr_parse(range->max, afi, p->fn, &ip.range.max)) {
> warnx("%s: RFC 3779 section 2.2.3.9: IPAddressRange: "
> "invalid IP address", p->fn);
> return 0;
> }
>
> - if (!ip_cert_compose_ranges(ip)) {
> + if (!ip_cert_compose_ranges(&ip)) {
> warnx("%s: RFC 3779 section 2.2.3.9: IPAddressRange: "
> "IP address range reversed", p->fn);
> return 0;
> }
>
> - return append_ip(p, ip);
> + return append_ip(p, &ip);
> +}
> +
> +static int
> +sbgp_addr_inherit(struct parse *p, enum afi afi)
> +{
> + struct cert_ip ip;
> +
> + memset(&ip, 0, sizeof(struct cert_ip));
> +
> + ip.afi = afi;
> + ip.type = CERT_IP_INHERIT;
> +
> + return append_ip(p, &ip);
> }
>
> /*
> @@ -310,25 +336,20 @@ sbgp_addr_range(struct parse *p, struct
> * Returns zero on failure, non-zero on success.
> */
> static int
> -sbgp_addr_or_range(struct parse *p, struct cert_ip *ip,
> - const IPAddressOrRanges *aors)
> +sbgp_addr_or_range(struct parse *p, enum afi afi, const IPAddressOrRanges
> *aors)
> {
> - struct cert_ip nip;
> const IPAddressOrRange *aor;
> int i, rc = 0;
>
> for (i = 0; i < sk_IPAddressOrRange_num(aors); i++) {
> - nip = *ip;
> aor = sk_IPAddressOrRange_value(aors, i);
> switch (aor->type) {
> case IPAddressOrRange_addressPrefix:
> - nip.type = CERT_IP_ADDR;
> - if (!sbgp_addr(p, &nip, aor->u.addressPrefix))
> + if (!sbgp_addr(p, afi, aor->u.addressPrefix))
> goto out;
> break;
> case IPAddressOrRange_addressRange:
> - nip.type = CERT_IP_RANGE;
> - if (!sbgp_addr_range(p, &nip, aor->u.addressRange))
> + if (!sbgp_addr_range(p, afi, aor->u.addressRange))
> goto out;
> break;
> default:
> @@ -355,13 +376,11 @@ sbgp_addr_or_range(struct parse *p, stru
> static int
> sbgp_ipaddrfam(struct parse *p, const IPAddressFamily *af)
> {
> - struct cert_ip ip;
> + enum afi afi;
> const IPAddressChoice *choice;
> int rc = 0;
>
> - memset(&ip, 0, sizeof(struct cert_ip));
> -
> - if (!ip_addr_afi_parse(p->fn, af->addressFamily, &ip.afi)) {
> + if (!ip_addr_afi_parse(p->fn, af->addressFamily, &afi)) {
> warnx("%s: RFC 3779 section 2.2.3.2: addressFamily: "
> "invalid AFI", p->fn);
> goto out;
> @@ -370,12 +389,11 @@ sbgp_ipaddrfam(struct parse *p, const IP
> choice = af->ipAddressChoice;
> switch (choice->type) {
> case IPAddressChoice_addressesOrRanges:
> - if (!sbgp_addr_or_range(p, &ip, choice->u.addressesOrRanges))
> + if (!sbgp_addr_or_range(p, afi, choice->u.addressesOrRanges))
> goto out;
> break;
> case IPAddressChoice_inherit:
> - ip.type = CERT_IP_INHERIT;
> - if (!append_ip(p, &ip))
> + if (!sbgp_addr_inherit(p, afi))
> goto out;
> break;
> default:
>
--
:wq Claudio