diff options
author | Ben Greear <greearb@candelatech.com> | 2010-07-31 07:10:23 -0700 |
---|---|---|
committer | Ben Greear <greearb@candelatech.com> | 2010-07-31 07:11:27 -0700 |
commit | 07bc7ea79509bcc9ef6e09151e81766ed00d3392 (patch) | |
tree | c9feacd031568fc053158907c190b9d219079688 /ares_process.c | |
parent | cef3a4c7aa584eee71da94c61fd65fd821bab65e (diff) | |
download | c-ares-07bc7ea79509bcc9ef6e09151e81766ed00d3392.tar.gz c-ares-07bc7ea79509bcc9ef6e09151e81766ed00d3392.tar.bz2 c-ares-07bc7ea79509bcc9ef6e09151e81766ed00d3392.zip |
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 <greearb@candelatech.com>
Diffstat (limited to 'ares_process.c')
-rw-r--r-- | 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 */ } |