File: local-getaddrinfo-freebsd-kernel.diff

package info (click to toggle)
glibc 2.36-9%2Bdeb12u13
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bookworm-proposed-updates
  • size: 300,148 kB
  • sloc: ansic: 1,055,755; asm: 324,942; makefile: 15,198; python: 12,603; sh: 10,884; cpp: 5,685; awk: 1,883; perl: 518; yacc: 292; pascal: 182; sed: 39
file content (28 lines) | stat: -rw-r--r-- 965 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
--- 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;