Tuomo described a case that failed:

conn A
        rightca=ROOTCA1
        rightid=@someone
        also=common
conn B
        rightca=SUBROOTCA1
        rightid=@someoneelse
        also=common

In refine_host_connection() we have this snippit:

                       bool match3 = match_requested_ca(c->requested_ca,
                                                        d->spd.this.ca,
                                                        &our_pathlen);

[...]

                     /* match2 and match3 are required */
                        if (!match2 || !match3)
                                continue;

So we look into match_requested_ca():

        while (requested_ca != NULL) {
                int pathlen;

                if (trusted_ca_nss(our_ca, requested_ca->name, &pathlen) &&
                        pathlen < *our_pathlen)
                        *our_pathlen = pathlen;
                requested_ca = requested_ca->next;
        }

        return *our_pathlen <= MAX_CA_PATH_LEN;


I'm confused here that there is no break or early return. We always seem
to process the entire list and return whatever is true for the last
entry. Was this meant:

        while (requested_ca != NULL) {
                int pathlen;

                if (trusted_ca_nss(our_ca, requested_ca->name, &pathlen) &&
                        pathlen < *our_pathlen) {
                        *our_pathlen = pathlen;
                        return TRUE;
                }
                requested_ca = requested_ca->next;
        }

        return FALSE;

Paul
_______________________________________________
Swan-dev mailing list
Swan-dev@lists.libreswan.org
https://lists.libreswan.org/mailman/listinfo/swan-dev

Reply via email to