From 7274405006c44e8af664c5ac7aa8b1e523d9a7be Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Sat, 29 Jan 2011 18:12:20 +1030 Subject: [PATCH] net: fix latent bug in _info example. Ben Hutchings points out that struct sockaddr isn't large enough to hold a struct sockaddr_in6. Our example works because we only access the family field, but anyone extending it might be surprised; use a union instead. --- ccan/net/_info | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/ccan/net/_info b/ccan/net/_info index 0b38c440..845458c0 100644 --- a/ccan/net/_info +++ b/ccan/net/_info @@ -14,6 +14,7 @@ * #include * #include * #include + * #include * #include * #include * @@ -22,8 +23,12 @@ * struct addrinfo *addr; * const char *dest, *port; * int fd; - * struct sockaddr saddr; - * socklen_t slen = sizeof(saddr); + * union { + * struct sockaddr s; + * struct sockaddr_in v4; + * struct sockaddr_in6 v6; + * } u; + * socklen_t slen = sizeof(u); * * if (argc == 2) { * dest = argv[1]; @@ -42,10 +47,10 @@ * if (fd < 0) * err(1, "Failed to connect to %s", dest); * - * if (getsockname(fd, &saddr, &slen) == 0) + * if (getsockname(fd, &u.s, &slen) == 0) * printf("Connected via %s\n", - * saddr.sa_family == AF_INET6 ? "IPv6" - * : saddr.sa_family == AF_INET ? "IPv4" + * u.s.sa_family == AF_INET6 ? "IPv6" + * : u.s.sa_family == AF_INET ? "IPv4" * : "UNKNOWN??"); * else * err(1, "Failed to get socket type for connection"); -- 2.39.2