chiark
/
gitweb
/
~mdw
/
adns
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
src/setup.c: Check netmask more carefully.
[adns]
/
src
/
setup.c
diff --git
a/src/setup.c
b/src/setup.c
index 96a2a213cde3d4cb699af092d01909b109cd139e..f73926c9f0c0ee50230fd4db0e408407515444eb 100644
(file)
--- a/
src/setup.c
+++ b/
src/setup.c
@@
-152,6
+152,7
@@
static void ccf_sortlist(adns_state ads, const char *fn,
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;
+ const char *maskwhat;
struct in_addr base, mask;
int l;
unsigned long initial, baselocal;
struct in_addr base, mask;
int l;
unsigned long initial, baselocal;
@@
-182,16
+183,13
@@
static void ccf_sortlist(adns_state ads, const char *fn,
if (slash) {
if (strchr(slash,'.')) {
if (slash) {
if (strchr(slash,'.')) {
+ maskwhat = "mask";
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;
- }
} else {
} else {
+ 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);
@@
-200,6
+198,7
@@
static void ccf_sortlist(adns_state ads, const char *fn,
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);
@@
-215,6
+214,13
@@
static void ccf_sortlist(adns_state ads, const char *fn,
}
}
}
}
+ 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++;