Index: sys/netinet/in.c =================================================================== --- sys/netinet/in.c +++ sys/netinet/in.c @@ -936,6 +936,7 @@ { register struct ifaddr *ifa; u_long t; + int found; if (in.s_addr == INADDR_BROADCAST || in.s_addr == INADDR_ANY) @@ -943,11 +944,13 @@ if ((ifp->if_flags & IFF_BROADCAST) == 0) return (0); t = ntohl(in.s_addr); + found = 0; /* * Look through the list of addresses for a match * with a broadcast address. */ #define ia ((struct in_ifaddr *)ifa) + if_addr_rlock(ifp); TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) if (ifa->ifa_addr->sa_family == AF_INET && (in.s_addr == ia->ia_broadaddr.sin_addr.s_addr || @@ -962,9 +965,12 @@ * only exist when an interface gets a secondary * address. */ - ia->ia_subnetmask != (u_long)0xffffffff) - return (1); - return (0); + ia->ia_subnetmask != (u_long)0xffffffff) { + found = 1; + break; + } + if_addr_runlock(ifp); + return (found); #undef ia }