From 8bc6ba624272e9df414358195025cd696c491ad9 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Thu, 10 Mar 2016 06:46:01 -0800 Subject: Mac OS X: must clear sockaddr in order to bind. Undocumented members in struct sockaddr_in, and possibly sockaddr_in6 also, must be cleared to all zero bits, otherwise bind fails for the loopback address, even if the relevant addressing members are correctly set. * socket.c (sockaddr_in): memset the IPv4 or IPv6 address to zero before filing it. --- socket.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'socket.c') diff --git a/socket.c b/socket.c index fb16088f..ae07c816 100644 --- a/socket.c +++ b/socket.c @@ -221,6 +221,7 @@ static void sockaddr_in(val sockaddr, val family, struct sockaddr_in *sa = coerce(struct sockaddr_in *, buf); if (family != num_fast(AF_INET)) addr_mismatch(sockaddr, family); + memset(sa, 0, sizeof *sa); sa->sin_family = AF_INET; ipv4_addr_from_num(&sa->sin_addr, addr); sa->sin_port = ntohs(c_num(port)); @@ -233,6 +234,7 @@ static void sockaddr_in(val sockaddr, val family, struct sockaddr_in6 *sa = coerce(struct sockaddr_in6 *, buf); if (family != num_fast(AF_INET6)) addr_mismatch(sockaddr, family); + memset(sa, 0, sizeof *sa); sa->sin6_family = AF_INET6; ipv6_addr_from_num(&sa->sin6_addr, addr); ipv6_flow_info_from_num(sa, flow); -- cgit v1.2.3