summaryrefslogtreecommitdiffstats
path: root/unix/tclUnixSock.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2017-04-28 08:00:51 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2017-04-28 08:00:51 (GMT)
commite5766f95f8b74aa6577cf8dff98d48a71ab9d131 (patch)
tree6e85f7dd2b98f0c060086540c153617c8b70ae9d /unix/tclUnixSock.c
parent69d1bdb95ef90f112d06b7ece0d6db57c504a030 (diff)
parent2836feb5d8fbaffcd6371c423cd0a0b0eebac840 (diff)
downloadtcl-e5766f95f8b74aa6577cf8dff98d48a71ab9d131.zip
tcl-e5766f95f8b74aa6577cf8dff98d48a71ab9d131.tar.gz
tcl-e5766f95f8b74aa6577cf8dff98d48a71ab9d131.tar.bz2
merge core-8-6-branchfix_1997007
Diffstat (limited to 'unix/tclUnixSock.c')
-rw-r--r--unix/tclUnixSock.c35
1 files changed, 28 insertions, 7 deletions
diff --git a/unix/tclUnixSock.c b/unix/tclUnixSock.c
index ca8d677..e8767e2 100644
--- a/unix/tclUnixSock.c
+++ b/unix/tclUnixSock.c
@@ -698,6 +698,33 @@ TcpClose2Proc(
*
*----------------------------------------------------------------------
*/
+
+#ifndef NEED_FAKE_RFC2553
+static inline int
+IPv6AddressNeedsNumericRendering(
+ struct in6_addr addr)
+{
+ if (IN6_ARE_ADDR_EQUAL(&addr, &in6addr_any)) {
+ return 1;
+ }
+
+ /*
+ * The IN6_IS_ADDR_V4MAPPED macro has a problem with aliasing warnings on
+ * at least some versions of OSX.
+ */
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wstrict-aliasing"
+ if (!IN6_IS_ADDR_V4MAPPED(&addr)) {
+#pragma GCC diagnostic pop
+ return 0;
+ }
+
+ return (addr.s6_addr[12] == 0 && addr.s6_addr[13] == 0
+ && addr.s6_addr[14] == 0 && addr.s6_addr[15] == 0);
+}
+#endif /* NEED_FAKE_RFC2553 */
+
static void
TcpHostPortList(
Tcl_Interp *interp,
@@ -723,13 +750,7 @@ TcpHostPortList(
}
#ifndef NEED_FAKE_RFC2553
} else if (addr.sa.sa_family == AF_INET6) {
- if ((IN6_ARE_ADDR_EQUAL(&addr.sa6.sin6_addr,
- &in6addr_any))
- || (IN6_IS_ADDR_V4MAPPED(&addr.sa6.sin6_addr) &&
- addr.sa6.sin6_addr.s6_addr[12] == 0 &&
- addr.sa6.sin6_addr.s6_addr[13] == 0 &&
- addr.sa6.sin6_addr.s6_addr[14] == 0 &&
- addr.sa6.sin6_addr.s6_addr[15] == 0)) {
+ if (IPv6AddressNeedsNumericRendering(addr.sa6.sin6_addr)) {
flags |= NI_NUMERICHOST;
}
#endif /* NEED_FAKE_RFC2553 */