From: GNU Libc Maintainers Date: Thu, 13 Jul 2023 18:07:47 +0000 (+0100) Subject: local-getaddrinfo-freebsd-kernel X-Git-Tag: archive/raspbian/2.36-9+rpi1+deb12u1^2~34 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=c8815d6a3b6d06bda6e8f3401ccc655ec804afb7;p=glibc.git local-getaddrinfo-freebsd-kernel Gbp-Pq: Topic kfreebsd Gbp-Pq: Name local-getaddrinfo-freebsd-kernel.diff --- diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c index 5cda9bb07..3f3b90367 100644 --- a/sysdeps/posix/getaddrinfo.c +++ b/sysdeps/posix/getaddrinfo.c @@ -2253,10 +2253,24 @@ try_connect (int *fdp, int *afp, struct sockaddr_in6 *source_addrp, int fd = *fdp; int af = *afp; socklen_t sl = sizeof (*source_addrp); + const struct sockaddr *sa = 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 while (true) { - if (fd != -1 && __connect (fd, addr, addrlen) == 0 + if (fd != -1 && __connect (fd, sa, addrlen) == 0 && __getsockname (fd, (struct sockaddr *) source_addrp, &sl) == 0) return true;