]> asedeno.scripts.mit.edu Git - PuTTY.git/commitdiff
Fix strict-aliasing warnings in sk_tcp_peer_info.
authorColin Watson <cjwatson@debian.org>
Thu, 28 Jan 2016 21:22:07 +0000 (21:22 +0000)
committerSimon Tatham <anakin@pobox.com>
Sat, 30 Jan 2016 14:33:54 +0000 (14:33 +0000)
GCC 6 emits strict-aliasing warnings here, so use the existing
sockaddr_union arrangements to avoid those.  As a prerequisite for being
able to express sk_tcp_peer_info in terms of sockaddr_union, I fixed up
the union elements to be a bit less odd in the NO_IPV6 case.

unix/uxnet.c

index 760d0a5719b036596feb896a1b760683dc7563a1..730f1fa7d5024d3e0dd6d0e28a064005cd045ac4 100644 (file)
  * Access to sockaddr types without breaking C strict aliasing rules.
  */
 union sockaddr_union {
-#ifdef NO_IPV6
-    struct sockaddr_in storage;
-#else
     struct sockaddr_storage storage;
-    struct sockaddr_in6 sin6;
-#endif
     struct sockaddr sa;
     struct sockaddr_in sin;
+#ifndef NO_IPV6
+    struct sockaddr_in6 sin6;
+#endif
     struct sockaddr_un su;
 };
 
@@ -1427,26 +1425,27 @@ static void sk_tcp_set_frozen(Socket sock, int is_frozen)
 static char *sk_tcp_peer_info(Socket sock)
 {
     Actual_Socket s = (Actual_Socket) sock;
-    struct sockaddr_storage addr;
+    union sockaddr_union addr;
     socklen_t addrlen = sizeof(addr);
+#ifndef NO_IPV6
     char buf[INET6_ADDRSTRLEN];
+#endif
 
-    if (getpeername(s->s, (struct sockaddr *)&addr, &addrlen) < 0)
+    if (getpeername(s->s, &addr.sa, &addrlen) < 0)
         return NULL;
-    if (addr.ss_family == AF_INET) {
+    if (addr.storage.ss_family == AF_INET) {
         return dupprintf
             ("%s:%d",
-             inet_ntoa(((struct sockaddr_in *)&addr)->sin_addr),
-             (int)ntohs(((struct sockaddr_in *)&addr)->sin_port));
+             inet_ntoa(addr.sin.sin_addr),
+             (int)ntohs(addr.sin.sin_port));
 #ifndef NO_IPV6
-    } else if (addr.ss_family == AF_INET6) {
+    } else if (addr.storage.ss_family == AF_INET6) {
         return dupprintf
             ("[%s]:%d",
-             inet_ntop(AF_INET6, &((struct sockaddr_in6 *)&addr)->sin6_addr,
-                       buf, sizeof(buf)),
-             (int)ntohs(((struct sockaddr_in6 *)&addr)->sin6_port));
+             inet_ntop(AF_INET6, &addr.sin6.sin6_addr, buf, sizeof(buf)),
+             (int)ntohs(addr.sin6.sin6_port));
 #endif
-    } else if (addr.ss_family == AF_UNIX) {
+    } else if (addr.storage.ss_family == AF_UNIX) {
         /*
          * For Unix sockets, the source address is unlikely to be
          * helpful. Instead, we try SO_PEERCRED and try to get the