Check broadcast address sanity before believing it.

This commit is contained in:
Martin Mares 2000-06-21 09:58:09 +00:00
parent bcbdcbb6ae
commit 2836ce3951

View file

@ -377,24 +377,28 @@ nl_parse_addr(struct nlmsghdr *h)
else
{
ip_addr netmask = ipa_mkmask(ifa.pxlen);
ip_addr xbrd;
ifa.prefix = ipa_and(ifa.ip, netmask);
ifa.brd = ipa_or(ifa.ip, ipa_not(netmask));
#ifndef IPV6
if (i->ifa_prefixlen == BITS_PER_IP_ADDRESS - 2)
ifa.opposite = ipa_opposite(ifa.ip);
if ((ifi->flags & IF_BROADCAST) && a[IFA_BROADCAST])
{
memcpy(&ifa.brd, RTA_DATA(a[IFA_BROADCAST]), sizeof(ifa.brd));
ipa_ntoh(ifa.brd);
}
memcpy(&xbrd, RTA_DATA(a[IFA_BROADCAST]), sizeof(xbrd));
ipa_ntoh(xbrd);
if (ipa_equal(xbrd, ifa.prefix) || ipa_equal(xbrd, ifa.brd))
ifa.brd = xbrd;
else
ifa.brd = ipa_or(ifa.ip, ipa_not(netmask));
log(L_ERR "KIF: Invalid broadcast address %I for %s", xbrd, ifi->name);
}
#endif
ifa.prefix = ipa_and(ifa.ip, netmask);
}
scope = ipa_classify(ifa.ip);
if (scope < 0)
{
log(L_ERR "KIF: Invalid interface address %I", ifa.ip);
log(L_ERR "KIF: Invalid interface address %I for %s", ifa.ip, ifi->name);
return;
}
ifa.scope = scope & IADDR_SCOPE_MASK;