local-getaddrinfo-freebsd-kernel
authorGNU Libc Maintainers <debian-glibc@lists.debian.org>
Tue, 5 May 2020 18:12:38 +0000 (19:12 +0100)
committerAurelien Jarno <aurel32@debian.org>
Tue, 5 May 2020 18:12:38 +0000 (19:12 +0100)
Gbp-Pq: Topic kfreebsd
Gbp-Pq: Name local-getaddrinfo-freebsd-kernel.diff

sysdeps/posix/getaddrinfo.c

index 2e50dbc98fc24fd3f610fcab3d732acd52cd3b00..880b6f69bd3c4a15891ccce3db7dd5f247bb0fe8 100644 (file)
@@ -2361,8 +2361,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)