File: local-getaddrinfo-freebsd-kernel.diff

package info (click to toggle)
glibc 2.28-7
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 271,524 kB
  • sloc: ansic: 1,008,513; asm: 259,608; makefile: 11,266; sh: 10,477; python: 6,910; cpp: 4,992; perl: 2,258; awk: 2,005; yacc: 290; pascal: 182; sed: 73
file content (25 lines) | stat: -rw-r--r-- 895 bytes parent folder | download | duplicates (16)
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
--- a/sysdeps/posix/getaddrinfo.c
+++ b/sysdeps/posix/getaddrinfo.c
@@ -2522,8 +2522,21 @@
 		}
 
 	      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)