87 lines
2.8 KiB
Diff
87 lines
2.8 KiB
Diff
From 07bc7ea79509bcc9ef6e09151e81766ed00d3392 Mon Sep 17 00:00:00 2001
|
|
From: Ben Greear <greearb@candelatech.com>
|
|
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 <greearb@candelatech.com>
|
|
---
|
|
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
|
|
|