diff --git a/nse_nsock.cc b/nse_nsock.cc index 2162f221d..372c00c08 100644 --- a/nse_nsock.cc +++ b/nse_nsock.cc @@ -425,6 +425,10 @@ static nse_nsock_udata *check_nsock_udata (lua_State *L, int idx, bool open) if (nu->source_addr.ss_family != AF_UNSPEC) { nsock_iod_set_localaddr(nu->nsiod, &nu->source_addr, nu->source_addrlen); } 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); nsock_iod_set_localaddr(nu->nsiod, &ss, sslen); } if (o.ipoptionslen) @@ -548,6 +552,10 @@ static int connect (lua_State *L, int status, lua_KContext ctx) if (nu->source_addr.ss_family != AF_UNSPEC) { nsock_iod_set_localaddr(nu->nsiod, &nu->source_addr, nu->source_addrlen); } 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); nsock_iod_set_localaddr(nu->nsiod, &ss, sslen); } if (o.ipoptionslen) diff --git a/scan_engine_connect.cc b/scan_engine_connect.cc index ace0b6d10..c473166a7 100644 --- a/scan_engine_connect.cc +++ b/scan_engine_connect.cc @@ -434,6 +434,10 @@ static void init_socket(int sd, const HostScanStats *hss, UltraScanInfo *USI) { #endif 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 (::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 a4e284718..ad58b8c90 100644 --- a/service_scan.cc +++ b/service_scan.cc @@ -2137,6 +2137,10 @@ static void startNextProbe(nsock_pool nsp, nsock_iod nsi, ServiceGroup *SG, fatal("Failed to allocate Nsock I/O descriptor in %s()", __func__); } 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); nsock_iod_set_localaddr(svc->niod, &ss, ss_len); } if (o.ipoptionslen)