summaryrefslogtreecommitdiff
path: root/ares_process.c
diff options
context:
space:
mode:
authorBen Greear <greearb@candelatech.com>2010-07-31 07:10:23 -0700
committerBen Greear <greearb@candelatech.com>2010-07-31 07:11:27 -0700
commit07bc7ea79509bcc9ef6e09151e81766ed00d3392 (patch)
treec9feacd031568fc053158907c190b9d219079688 /ares_process.c
parentcef3a4c7aa584eee71da94c61fd65fd821bab65e (diff)
downloadc-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.c23
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 */
}