Rationalise hostname_cmp()

This commit is contained in:
Simon Kelley
2014-01-21 14:28:02 +00:00
parent c979fa04a4
commit dbf721235b

View File

@@ -951,78 +951,64 @@ int dnssec_validate_ds(time_t now, struct dns_header *header, size_t plen, char
/* 4034 6.1 */ /* 4034 6.1 */
static int hostname_cmp(const char *a, const char *b) static int hostname_cmp(const char *a, const char *b)
{ {
char *sa = NULL, *pa = (char *)a + strlen(a); char *sa, *ea, *ca, *sb, *eb, *cb;
char *sb = NULL, *pb = (char *)b + strlen(b); unsigned char ac, bc;
char *ca, *cb;
char sac = 0, sbc = 0; sa = ea = (char *)a + strlen(a);
int rc; sb = eb = (char *)b + strlen(b);
while (1) while (1)
{ {
while (pa != a && *pa != '.') while (sa != a && *(sa-1) != '.')
pa--; sa--;
while (pb != b && *pb != '.') while (sb != b && *(sb-1) != '.')
pb--; sb--;
ca = *pa == '.' ? pa+1 : pa; ca = sa;
cb = *pb == '.' ? pb+1 : pb; cb = sb;
while (1) { while (1)
unsigned char c1 = (unsigned char) *ca++;
unsigned char c2 = (unsigned char) *cb++;
if (c1 == 0)
{
rc = (c2 == 0) ? 0 : -1;
break;
}
if (c2 == 0)
{
rc = 1;
break;
}
if (c1 >= 'A' && c1 <= 'Z')
c1 += 'a' - 'A';
if (c2 >= 'A' && c2 <= 'Z')
c2 += 'a' - 'A';
if (c1 != c2)
{
if (c1 < c2)
rc = -1;
else
rc = 1;
break;
}
}
if (rc == 0)
{ {
if (pa == a && pb != b) if (ca == ea)
rc = 1; {
if (cb == eb)
break;
if (pa != a && pb == b) return -1;
rc = -1; }
if (cb == eb)
return 1;
ac = (unsigned char) *ca++;
bc = (unsigned char) *cb++;
if (ac >= 'A' && ac <= 'Z')
ac += 'a' - 'A';
if (bc >= 'A' && bc <= 'Z')
bc += 'a' - 'A';
if (ac > bc)
return -1;
else if (ac != bc)
return 1;
} }
if (sa)
*sa = sac;
if (sb) if (sa == a)
*sb = sbc; {
if (sb == b)
return 0;
if ((pa == a && pb == b) || rc != 0) return -1;
return rc; }
sa = pa, sac = *sa, *sa = 0; if (sb == b)
sb = pb, sbc = *sb, *sb = 0; return 1;
pa--; ea = sa--;
pb--; eb = sb--;
} }
} }