From 898e91b9a35587c35a2e1b65d814cb2b7196943d Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Tue, 10 Jun 2014 21:57:52 +0100 Subject: [PATCH] src/types.c: When sorting, IPv4 prefixes match v6-mapped IPv4 addresses. It's not very pretty, but the whole business of v6-mapped addresses is a bodge, IMHO. Signed-off-by: Mark Wooding --- src/types.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) 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; } -- 2.30.2