From 12c44558a2e05a55df277c974f8382331855cbe1 Mon Sep 17 00:00:00 2001 From: GNU Libc Maintainers Date: Fri, 26 Jan 2018 22:35:29 +0000 Subject: [PATCH] local-getaddrinfo-freebsd-kernel Gbp-Pq: Topic kfreebsd Gbp-Pq: Name local-getaddrinfo-freebsd-kernel.diff --- sysdeps/posix/getaddrinfo.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c index 2c4b6d679..d93ca1a35 100644 --- a/sysdeps/posix/getaddrinfo.c +++ b/sysdeps/posix/getaddrinfo.c @@ -2411,8 +2411,21 @@ getaddrinfo (const char *name, const char *service, } socklen_t sl = sizeof (results[i].source_addr); + const struct sockaddr *sa = q->ai_addr; +#ifdef __FreeBSD_kernel__ + struct sockaddr_in6 sa_in6; + /* The FreeBSD kernel doesn't allow connections on port 0. Use + port 1 instead, as on the FreeBSD libc. */ + if (((struct sockaddr_in *)sa)->sin_port == htons(0)) + { + sa = (struct sockaddr *)&sa_in6; + memcpy(&sa_in6, q->ai_addr, q->ai_family == AF_INET6 ? + sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in)); + sa_in6.sin6_port = htons(1); + } +#endif if (fd != -1 - && __connect (fd, q->ai_addr, q->ai_addrlen) == 0 + && __connect (fd, sa, q->ai_addrlen) == 0 && __getsockname (fd, (struct sockaddr *) &results[i].source_addr, &sl) == 0) -- 2.30.2