[crybaby ~/src/adns/build]RES_CONF_TEXT="sortlist 172.29.199.1/24" RES_OPTIONS="adns_checkc:entex" adnshost -ta www-cache.distorted.org.uk
adnshost: ../src/check.c:83: checkc_global: Assertion `!(ads->sortlist[i].base.s_addr & ~ads->sortlist[i].mask.s_addr)' failed.
Aborted
Unfortunately, `ccf_sortlist' only checked that the free bits of the
network address are clear when given a general netmask, so if you give a
prefix length or leave it implicit then you hit a consistency check
failure later.
Check the mask later on, after all of the variants are handled. There's
a little bit of variation in the message.
Signed-off-by: Mark Wooding <mdw@distorted.org.uk>
int lno, const char *buf) {
const char *word;
char tbuf[200], *slash, *ep;
int lno, const char *buf) {
const char *word;
char tbuf[200], *slash, *ep;
struct in_addr base, mask;
int l;
unsigned long initial, baselocal;
struct in_addr base, mask;
int l;
unsigned long initial, baselocal;
if (slash) {
if (strchr(slash,'.')) {
if (slash) {
if (strchr(slash,'.')) {
if (!inet_aton(slash,&mask)) {
configparseerr(ads,fn,lno,"invalid mask `%s' in sortlist",slash);
continue;
}
if (!inet_aton(slash,&mask)) {
configparseerr(ads,fn,lno,"invalid mask `%s' in sortlist",slash);
continue;
}
- if (base.s_addr & ~mask.s_addr) {
- configparseerr(ads,fn,lno, "mask `%s' in sortlist"
- " overlaps address `%s'",slash,tbuf);
- continue;
- }
+ maskwhat = "prefix length";
initial= strtoul(slash,&ep,10);
if (*ep || initial>32) {
configparseerr(ads,fn,lno,"mask length `%s' invalid",slash);
initial= strtoul(slash,&ep,10);
if (*ep || initial>32) {
configparseerr(ads,fn,lno,"mask length `%s' invalid",slash);
mask.s_addr= htonl((0x0ffffffffUL) << (32-initial));
}
} else {
mask.s_addr= htonl((0x0ffffffffUL) << (32-initial));
}
} else {
+ maskwhat = "implied mask";
baselocal= ntohl(base.s_addr);
if (!(baselocal & 0x080000000UL)) /* class A */
mask.s_addr= htonl(0x0ff000000UL);
baselocal= ntohl(base.s_addr);
if (!(baselocal & 0x080000000UL)) /* class A */
mask.s_addr= htonl(0x0ff000000UL);
+ if (base.s_addr & ~mask.s_addr) {
+ configparseerr(ads,fn,lno, "%s `%s' in sortlist"
+ " overlaps address `%s'",maskwhat,
+ slash ? slash : inet_ntoa(mask), tbuf);
+ continue;
+ }
+
ads->sortlist[ads->nsortlist].base= base;
ads->sortlist[ads->nsortlist].mask= mask;
ads->nsortlist++;
ads->sortlist[ads->nsortlist].base= base;
ads->sortlist[ads->nsortlist].mask= mask;
ads->nsortlist++;