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

Reply via email to