Fix aliasing
diff --git a/src/core/iomgr/tcp_server_posix.c b/src/core/iomgr/tcp_server_posix.c
index 355a040..6a96163 100644
--- a/src/core/iomgr/tcp_server_posix.c
+++ b/src/core/iomgr/tcp_server_posix.c
@@ -75,7 +75,11 @@
   int fd;
   grpc_fd *emfd;
   grpc_tcp_server *server;
-  gpr_uint8 addr[GRPC_MAX_SOCKADDR_SIZE];
+  union {
+    gpr_uint8 untyped[GRPC_MAX_SOCKADDR_SIZE];
+    struct sockaddr sockaddr;
+    struct sockaddr_un un;
+  } addr;
   int addr_len;
 } server_port;
 
@@ -125,9 +129,8 @@
   /* delete ALL the things */
   for (i = 0; i < s->nports; i++) {
     server_port *sp = &s->ports[i];
-    if (((struct sockaddr *)sp->addr)->sa_family == AF_UNIX) {
-      struct sockaddr_un *un = (struct sockaddr_un *)sp->addr;
-      unlink(un->sun_path);
+    if (sp->addr.sockaddr.sa_family == AF_UNIX) {
+      unlink(sp->addr.un.sun_path);
     }
     grpc_fd_orphan(sp->emfd, NULL, NULL);
   }
@@ -273,7 +276,7 @@
     sp->server = s;
     sp->fd = fd;
     sp->emfd = grpc_fd_create(fd);
-    memcpy(sp->addr, addr, addr_len);
+    memcpy(sp->addr.untyped, addr, addr_len);
     sp->addr_len = addr_len;
     GPR_ASSERT(sp->emfd);
     gpr_mu_unlock(&s->mu);