0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2024-12-22 17:51:53 +00:00

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