diff --git a/nse_nsock.cc b/nse_nsock.cc index 372c00c08..e2ff02526 100644 --- a/nse_nsock.cc +++ b/nse_nsock.cc @@ -427,8 +427,12 @@ static nse_nsock_udata *check_nsock_udata (lua_State *L, int idx, bool open) } else if (0 == o.SourceSockAddr(&ss, &sslen)) { // Use the exact protocol-specific length. Some platforms (e.g. FreeBSD) // reject sizeof(sockaddr_storage) passed to bind() with EINVAL. - sslen = (ss.ss_family == AF_INET6) ? - sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in); + if (ss.ss_family == AF_INET) + sslen = sizeof(struct sockaddr_in); +#if HAVE_IPV6 + else if (ss.ss_family == AF_INET6) + sslen = sizeof(struct sockaddr_in6); +#endif nsock_iod_set_localaddr(nu->nsiod, &ss, sslen); } if (o.ipoptionslen) @@ -554,8 +558,12 @@ static int connect (lua_State *L, int status, lua_KContext ctx) } else if (0 == o.SourceSockAddr(&ss, &sslen)) { // Use the exact protocol-specific length. Some platforms (e.g. FreeBSD) // reject sizeof(sockaddr_storage) passed to bind() with EINVAL. - sslen = (ss.ss_family == AF_INET6) ? - sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in); + if (ss.ss_family == AF_INET) + sslen = sizeof(struct sockaddr_in); +#if HAVE_IPV6 + else if (ss.ss_family == AF_INET6) + sslen = sizeof(struct sockaddr_in6); +#endif nsock_iod_set_localaddr(nu->nsiod, &ss, sslen); } if (o.ipoptionslen) diff --git a/scan_engine_connect.cc b/scan_engine_connect.cc index c473166a7..7390cd712 100644 --- a/scan_engine_connect.cc +++ b/scan_engine_connect.cc @@ -436,8 +436,12 @@ static void init_socket(int sd, const HostScanStats *hss, UltraScanInfo *USI) { if (!bind_failed && 0 == o.SourceSockAddr(&ss, &sslen)) { // Use the exact protocol-specific length. Some platforms (e.g. FreeBSD) // reject sizeof(sockaddr_storage) passed to bind() with EINVAL. - sslen = (ss.ss_family == AF_INET6) ? - sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in); + if (ss.ss_family == AF_INET) + sslen = sizeof(struct sockaddr_in); +#if HAVE_IPV6 + else if (ss.ss_family == AF_INET6) + sslen = sizeof(struct sockaddr_in6); +#endif if (::bind(sd, (struct sockaddr*)&ss, sslen) != 0) { error("%s: Problem binding source address (%s), errno: %d", __func__, inet_socktop_safe(&ss), socket_errno()); perror("bind"); diff --git a/service_scan.cc b/service_scan.cc index ad58b8c90..f22778d5c 100644 --- a/service_scan.cc +++ b/service_scan.cc @@ -2139,8 +2139,12 @@ static void startNextProbe(nsock_pool nsp, nsock_iod nsi, ServiceGroup *SG, if (0 == svc->target->SourceSockAddr(&ss, &ss_len)) { // Use the exact protocol-specific length. Some platforms (e.g. FreeBSD) // reject sizeof(sockaddr_storage) passed to bind() with EINVAL. - ss_len = (ss.ss_family == AF_INET6) ? - sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in); + if (ss.ss_family == AF_INET) + ss_len = sizeof(struct sockaddr_in); +#if HAVE_IPV6 + else if (ss.ss_family == AF_INET6) + ss_len = sizeof(struct sockaddr_in6); +#endif nsock_iod_set_localaddr(svc->niod, &ss, ss_len); } if (o.ipoptionslen)