X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=adns.git;a=blobdiff_plain;f=src%2Ftypes.c;h=eacf2f38c56f9973d273bf0efb6f24970cc632ea;hp=0658615f42d1a50d75a80e762c77ba4a776797e5;hb=898e91b9a35587c35a2e1b65d814cb2b7196943d;hpb=66ade6021bca9f024d7bcd2b3ddeedf7a1b3a90c diff --git a/src/types.c b/src/types.c index 0658615..eacf2f3 100644 --- a/src/types.c +++ b/src/types.c @@ -261,11 +261,27 @@ static adns_status pa_inaddr(const parseinfo *pai, int cbyte, static int search_sortlist(adns_state ads, int af, const void *ad) { const struct sortlist *slp; + const struct in6_addr *a6; + union gen_addr a; int i; - + int v6mappedp= 0; + + if (af == AF_INET6) { + a6= ad; + if (IN6_IS_ADDR_V4MAPPED(a6)) { + a.v4.s_addr= htonl(((unsigned long)a6->s6_addr[12] << 24) | + ((unsigned long)a6->s6_addr[13] << 16) | + ((unsigned long)a6->s6_addr[14] << 8) | + ((unsigned long)a6->s6_addr[15] << 0)); + v6mappedp= 1; + } + } + for (i=0, slp=ads->sortlist; insortlist && - !adns__addr_match_p(af,ad, slp->af,&slp->base,&slp->mask); + !adns__addr_match_p(af,ad, slp->af,&slp->base,&slp->mask) && + !(v6mappedp && + adns__addr_match_p(AF_INET,&a, slp->af,&slp->base,&slp->mask)); i++, slp++); return i; }