From 07bc7ea79509bcc9ef6e09151e81766ed00d3392 Mon Sep 17 00:00:00 2001 From: Ben Greear Date: Sat, 31 Jul 2010 07:10:23 -0700 Subject: [PATCH] Fix aliasing warning in gcc 4.4.4 (at least). Should be no functional change, though the code gets a bit ugglier. Signed-off-by: Ben Greear --- ares_process.c | 23 ++++++++++++++++++----- 1 files changed, 18 insertions(+), 5 deletions(-) diff --git a/ares_process.c b/ares_process.c index c3d7fa4..320dd5e 100644 --- a/ares_process.c +++ b/ares_process.c @@ -434,11 +434,15 @@ static void read_udp_packets(ares_channel channel, fd_set *read_fds, unsigned char buf[PACKETSZ + 1]; #ifdef HAVE_RECVFROM ares_socklen_t fromlen; +#ifdef HAVE_STRUCT_SOCKADDR_STORAGE + struct sockaddr_storage from; +#else union { struct sockaddr_in sa4; struct sockaddr_in6 sa6; } from; #endif +#endif if(!read_fds && (read_fd == ARES_SOCKET_BAD)) /* no possible action */ @@ -473,10 +477,7 @@ static void read_udp_packets(ares_channel channel, fd_set *read_fds, * packets as we can. */ do { #ifdef HAVE_RECVFROM - if (server->addr.family == AF_INET) - fromlen = sizeof(from.sa4); - else - fromlen = sizeof(from.sa6); + fromlen = sizeof(from); /* doesn't matter if it's larger than needed */ count = (ssize_t)recvfrom(server->udp_socket, (void *)buf, sizeof(buf), 0, (struct sockaddr *)&from, &fromlen); #else @@ -487,7 +488,15 @@ static void read_udp_packets(ares_channel channel, fd_set *read_fds, else if (count <= 0) handle_error(channel, i, now); #ifdef HAVE_RECVFROM - else if (!same_address((struct sockaddr *)&from, &server->addr)) +#ifdef HAVE_STRUCT_SOCKADDR_STORAGE + /* This family hack works around compiler warnings about + * aliases. + */ + else if (!((from.ss_family == server->addr.family) && + same_address((struct sockaddr *)&from, &server->addr))) +#else + else if (!same_address((struct sockaddr *)&from, &server->addr))) +#endif /* The address the response comes from does not match * the address we sent the request to. Someone may be * attempting to perform a cache poisoning attack. */ @@ -1177,8 +1186,10 @@ static int same_address(struct sockaddr *sa, struct ares_addr *aa) void *addr1; void *addr2; +#ifndef HAVE_STRUCT_SOCKADDR_STORAGE if (sa->sa_family == aa->family) { +#endif switch (aa->family) { case AF_INET: @@ -1196,7 +1207,9 @@ static int same_address(struct sockaddr *sa, struct ares_addr *aa) default: break; } +#ifndef HAVE_STRUCT_SOCKADDR_STORAGE } +#endif return 0; /* different */ } -- 1.7.2.1