]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Check broadcast address sanity before believing it.
authorMartin Mares <mj@ucw.cz>
Wed, 21 Jun 2000 09:58:09 +0000 (09:58 +0000)
committerMartin Mares <mj@ucw.cz>
Wed, 21 Jun 2000 09:58:09 +0000 (09:58 +0000)
sysdep/linux/netlink/netlink.c

index 1a0f5d2dd4de23fa8e15a9af43d0b927fc8dd997..fd9b3711a2794e14387ee8a17559aa4d6681809b 100644 (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
+           log(L_ERR "KIF: Invalid broadcast address %I for %s", xbrd, ifi->name);
        }
-      else
-       ifa.brd = ipa_or(ifa.ip, ipa_not(netmask));
 #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;