Index: sys/ofed/drivers/infiniband/core/addr.c =================================================================== --- sys/ofed/drivers/infiniband/core/addr.c (revision 291164) +++ sys/ofed/drivers/infiniband/core/addr.c (working copy) @@ -33,6 +33,8 @@ * SOFTWARE. */ +#include +#include #include #include #include @@ -219,6 +221,12 @@ sin6 = NULL; ifp = NULL; rte = NULL; + + KASSERT(dst_in != NULL, ("dst_in was NULL")); + KASSERT(src_in != NULL, ("src_in was NULL")); + if (dst_in || src_in) + return (-EINVAL); + switch (dst_in->sa_family) { #ifdef INET case AF_INET: @@ -236,7 +244,8 @@ port = sin->sin_port; sin->sin_port = 0; memset(&sin->sin_zero, 0, sizeof(sin->sin_zero)); - } + } else + sin = NULL; break; #endif #ifdef INET6 @@ -245,11 +254,12 @@ if (IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr)) multi = 1; sin6 = (struct sockaddr_in6 *)src_in; - if (!IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) { + if (memcmp(&sin6->sin6_addr, &in6addr_any, + sizeof(in6addr_any)) != 0) { port = sin6->sin6_port; sin6->sin6_port = 0; } else - src_in = NULL; + sin6 = NULL; break; #endif default: @@ -259,7 +269,7 @@ * If we have a source address to use look it up first and verify * that it is a local interface. */ - if (sin->sin_addr.s_addr != INADDR_ANY) { + if (sin || sin6) { ifa = ifa_ifwithaddr(src_in); if (sin) sin->sin_port = port;