Simplify rrset_canonical_order() with new canonicalization functions.

This commit is contained in:
Giovanni Bajo
2012-05-02 00:31:19 +02:00
committed by Simon Kelley
parent 4885d57c58
commit da23c4f960

View File

@@ -353,54 +353,34 @@ struct {
static int rrset_canonical_order(const void *r1, const void *r2) static int rrset_canonical_order(const void *r1, const void *r2)
{ {
size_t r1len, r2len; size_t r1len, r2len;
int rrtype, i; int rrtype;
unsigned char *pr1=*(unsigned char**)r1, *pr2=*(unsigned char**)r2; unsigned char *pr1=*(unsigned char**)r1, *pr2=*(unsigned char**)r2;
unsigned char tmp1[MAXCDNAME], tmp2[MAXCDNAME]; /* TODO: use part of daemon->namebuff */ unsigned char tmp1[MAXCDNAME], tmp2[MAXCDNAME]; /* TODO: use part of daemon->namebuff */
#define ORDER(buf1,len1, buf2,len2) \
do { \
int res = memcmp(buf1, buf2, MIN(len1,len2)); \
if (res != 0) return res; \
if (len1 < len2) return -1; \
if (len1 > len2) return 1; \
} while (0)
GETSHORT(rrtype, pr1); GETSHORT(rrtype, pr1);
pr1 += 6; pr2 += 8; pr1 += 6; pr2 += 8;
GETSHORT(r1len, pr1); GETSHORT(r2len, pr2);
if (rrtype < countof(rdata_description)) RDataCForm cf1, cf2;
for (i = 0; rdata_description[rrtype][i] != RDESC_END; ++i) rdata_cform_init(&cf1, rrset_canonical_order_ctx.header, rrset_canonical_order_ctx.pktlen,
{ pr1, rrtype, tmp1);
int d = rdata_description[rrtype][i]; rdata_cform_init(&cf2, rrset_canonical_order_ctx.header, rrset_canonical_order_ctx.pktlen,
if (d == RDESC_DOMAIN) pr2, rrtype, tmp2);
{ while ((pr1 = rdata_cform_next(&cf1, &r1len)) &&
int dl1 = process_domain_name(rrset_canonical_order_ctx.header, rrset_canonical_order_ctx.pktlen, (pr2 = rdata_cform_next(&cf2, &r2len)))
&pr1, &r1len, tmp1, PWN_EXTRACT); {
int dl2 = process_domain_name(rrset_canonical_order_ctx.header, rrset_canonical_order_ctx.pktlen, int res = memcmp(pr1, pr2, MIN(r1len,r2len));
&pr2, &r2len, tmp2, PWN_EXTRACT); if (res != 0)
/* TODO: how do we handle errors, that is dl1==0 or dl2==0 ? */ return res;
assert(dl1 != 0); if (r1len < r2len)
assert(dl2 != 0); return -1;
ORDER(tmp1, dl1, tmp2, dl2); if (r2len > r1len)
} return 1;
else }
{
ORDER(pr1, d, pr2, d);
pr1 += d; pr2 += d;
r1len -= d; r2len -= d;
}
}
/* Order the rest of the record. */ /* If we reached this point, the two RRs are identical (or an error occurred).
ORDER(pr1, r1len, pr2, r2len);
/* If we reached this point, the two RRs are identical.
RFC2181 says that an RRset is not allowed to contain duplicate RFC2181 says that an RRset is not allowed to contain duplicate
records. If it happens, it is a protocol error and anything goes. */ records. If it happens, it is a protocol error and anything goes. */
return 1; return 1;
#undef ORDER
} }
typedef struct PendingRRSIGValidation typedef struct PendingRRSIGValidation